【发布时间】:2017-09-24 15:03:18
【问题描述】:
首先,这是我得到的错误:
java.lang.IllegalStateException:应用程序的 PagerAdapter 更改适配器的内容而不调用 PagerAdapter#notifyDataSetChanged!预期的适配器项目数:18, 找到:28
我在我的主要活动中使用RecyclerView,并且有一个List<Objects> 作为数据集,这很好。
当单击 RecyclerView 项目时,我从该活动中调用第二个活动,该项目基本上是使用 ViewPager 使用此代码实现的画廊:
public void startSlideActivity(final int position) {
DataTransferer.get().storeItems(feed);
Intent i = new Intent(context, SlideActivity.class);
...
i.putExtra("POSITION", position);
context.startActivity(i);
}
我的数据太大而无法通过 Intent 传输(使用 Parcelable 或其他方式),所以我使用单例来保存和传输我的列表,代码如下:
public class DataTransferer {
private static volatile DataTransferer singleton;
private List<Thing> items;
public static DataTransferer get(){
if (singleton == null) {
synchronized (DataTransferer.class) {
singleton = new DataTransferer();
}
}
return singleton;
}
private DataTransferer(){
}
public void storeItems(List<Thing> items){
this.items = items;
}
public List<Thing> getStoredItems(){
return items;
}
}
在第二个活动中,我设置适配器并检索列表,如下所示:
feed = DataTransferer.get().getStoredItems();
final int position = this.getIntent().getIntExtra("POSITION", 0);
adapter = new FeedPagerAdapter(SlideActivity.this, feed);
viewPager.setAdapter(adapter);
adapter.notifyDataSetChanged();
viewPager.setCurrentItem(position);
viewPager.setOffscreenPageLimit(4);
最后是我的 PagerAdapter 代码:
public class FeedPagerAdapter extends PagerAdapter {
@BindView(R.id.item_image_view) ImageView image;
private final SlideActivity host;
private List<Thing> items;
public FeedPagerAdapter(SlideActivity host, List<Thing> items){
this.host = host;
this.items = items;
notifyDataSetChanged();
}
@Override
public Object instantiateItem(ViewGroup parent, int position) {
View view = LayoutInflater.from(host).inflate(R.layout.item, parent, false);
ButterKnife.bind(this, view);
...
parent.addView(view);
return view;
}
@Override
public int getCount() {
return items.size();
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
container.removeView((View)object);
}
@Override
public boolean isViewFromObject(View view, Object object) {
return view == object;
}
}
我尝试在适配器中通知onResume 和onPause 中的数据集和getItemCount,同样的问题。
回到主活动,这些数据通过网络加载,并在加载完成时将项目添加到列表中。如果我启动我的应用程序并在它们开始填充 RecyclerView 时单击该项目,它会打开第二个活动并且我得到崩溃。如果我启动应用程序并等待一秒钟并单击 RecyclerView 项目,它会按预期工作。
如果有人对我在开始第二个活动时如何等待以确保列表稳定或实现基于网格的 RecyclerView 库以打开具有相同数据集的 viewpager 类型布局的更好方法有任何建议,我将不胜感激它。
【问题讨论】:
标签: java android android-recyclerview android-viewpager illegalstateexception