java我们何时在PagerAdapter上通知更改的数据
我已经看到了关于这个主题的几个问题,我尝试添加了建议的onNotifyDataChanged,但似乎没有任何效果。我将感谢任何帮助,下面是我的类和内部类MyViewPagerAdapter,我如何停止修复此问题
java.lang.IllegalStateException: The application's PagerAdapter changed the adapter's contents without calling PagerAdapter#notifyDataSetChanged! Expected adapter item count: 0,
代码:
public class SlideShowFragment extends DialogFragment {
private final String TAG = SlideShowFragment.class.getSimpleName();
private ArrayList<Image> images;
private ProgressBar pd;
/**
* a simple newInstance
*
* @return slideShowFragment
*/
public static SlideShowFragment newInstance() {
SlideShowFragment slideShowFragment = new SlideShowFragment();
return slideShowFragment;
}
@Override
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.fragment_slideshow_dialog_fragement, container, false);
ViewPager viewPager = v.findViewById(R.id.viewpager);
assert getArguments() != null;
images = (ArrayList<Image>) getArguments().getSerializable("images");
int selectedPosition = getArguments().getInt("position");
pd = v.findViewById(R.id.img_progress);
Log.e(TAG, "position: " + selectedPosition);
Log.e(TAG, "images size: " + images.size());
MyViewPagerAdapter myViewPagerAdapter = new MyViewPagerAdapter();
//added this incase of crash #FIXME 5/25/2018
myViewPagerAdapter.notifyDataSetChanged();
viewPager.setAdapter(myViewPagerAdapter);
return v;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setStyle(DialogFragment.STYLE_NORMAL, 安卓.R.style.Theme_Black_NoTitleBar_Fullscreen);
}
/**
* myViewPager Adapter inner class
* I am using the Glide Library to help me display
* images from the json data on my server.
*/
class MyViewPagerAdapter extends PagerAdapter {
private LayoutInflater layoutInflater;
MyViewPagerAdapter() {
}
@TargetApi(Build.VERSION_CODES.KITKAT)
@NonNull
@Override
public Object instantiateItem(@NonNull ViewGroup container, int position) {
layoutInflater = (LayoutInflater) Objects.requireNonNull(getActivity()).getSystemService(Context.LAYOUT_INFLATER_SERVICE);
assert layoutInflater != null;
View view = layoutInflater.inflate(R.layout.image_fullscreen_preview, container, false);
try {
ImageView imageViewPreview = view.findViewById(R.id.image_preview);
Image image = images.get(position);
Glide.with(getActivity()).load(image.getLarge())
.thumbnail(0.5f)
.crossFade()
.diskCacheStrategy(DiskCacheStrategy.ALL)
.error(R.drawable.reload)
.listener(new RequestListener<String, GlideDrawable>() {
@Override
public boolean onException(Exception e, String model, Target<GlideDrawable> target, boolean isFirstResource) {
pd.setVisibility(View.VISIBLE);
return false;
}
@Override
public boolean onResourceReady(GlideDrawable resource, String model, Target<GlideDrawable> target,
boolean isFromMemoryCache, boolean isFirstResource) {
pd.setVisibility(View.INVISIBLE);
return false;
}
})
.into(imageViewPreview);
// pd.setVisibility(View.INVISIBLE);
container.addView(view);
}catch (ExecutionError e){
Toast.makeText(getContext(),"Please Check Connection", Toast.LENGTH_SHORT).show();
}
return view;
}
@Override
public int getCount() {
return images.size();
}
@Override
public boolean isViewFromObject(@NonNull View view, @NonNull Object obj) {
return view == obj;
}
@Override
public void destroyItem(@NonNull ViewGroup container, int position, @NonNull Object object) {
container.removeView((View) object);
}
}
}
# 1 楼答案
在我看来,如果您正在使用一个适配器,并在该适配器中分配了一个空的或一些基本的数据集,然后再次希望在相同的数据集中添加更多的数据,并希望在不将其加载回初始配置的情况下更新布局,那么您可以使用“notifyDataChanges”此方法将自动加载已加载的数据已在adpater中额外添加或用户刚刚更新
例如:
在这种情况下,我们为视图分配了一个空适配器,但我想添加更多数据,然后在不反复加载的情况下更改视图,因此现在我可以在列表数据中添加数据,然后使用“notifyDataChanged”