所以第一件事情,下面是我得到的錯誤:PagerAdapter改變適配器內容與第一通知
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);
}
我的數據太大,通過一個意圖轉讓(使用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
和和getItemCount。
回到主要活動,此數據通過網絡加載,並在加載完成時將項目添加到列表中。如果我啓動我的應用程序並在開始填充RecyclerView時立即點擊該項目,它會打開第二個活動,並且我收到崩潰。如果我啓動應用程序並等待一秒鐘,然後單擊RecyclerView項目,它將按預期工作。
如果任何人有任何建議,我可以等待,以確保列表是穩定的,當啓動第二個活動或更好的方法來實現基於網格的RecyclerView畫廊打開viewpager類型佈局與相同的數據集我真的欣賞它。
那個方法是什麼類的一部分? (編輯:谷歌說,它連接到一個片段,我沒有在任何地方使用片段) – rycirese
@rycirese viewpager屏幕中的類是什麼類型?我通常將這種方法用於我的「片段」。你的聽起來像你正在使用'活動' – TranHieu
正確,所有這些活動,是一個視圖。 – rycirese