0

所以第一件事情,下面是我得到的錯誤: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類型佈局與相同的數據集我真的欣賞它。

回答

0

這是因爲您正在使用此行viewPager.setOffscreenPageLimit(4);,這意味着viewpager不會在所有4頁中重新創建屏幕。但是,有一種功能可以檢測您的屏幕是否完全可見,請致電setUserVisibleHint()。你只需要使用如下:// 對於片段的情況下

@Override 
    public void setUserVisibleHint(boolean isVisibleToUser) { 
     if (isVisibleToUser) { 
     //TODO notify your recyclerview data over here 
     } 
    } 

編輯:

該活動的情況:如果定位API 14級以上,可以使用

android.app.Application.ActivityLifecycleCallbacks

public class MyApplication extends Application implements ActivityLifecycleCallbacks { 
    private static boolean isInterestingActivityVisible; 

    @Override 
    public void onCreate() { 
     super.onCreate(); 

     // Register to be notified of activity state changes 
     registerActivityLifecycleCallbacks(this); 
     .... 
    } 

    public boolean isInterestingActivityVisible() { 
     return isInterestingActivityVisible; 
    } 

    @Override 
    public void onActivityResumed(Activity activity) { 
     if (activity instanceof MyInterestingActivity) { 
      isInterestingActivityVisible = true; 
     } 
    } 

    @Override 
    public void onActivityStopped(Activity activity) { 
     if (activity instanceof MyInterestingActivity) { 
      isInterestingActivityVisible = false; 
     } 
    } 

    // Other state change callback stubs 
    .... 
} 

在AndroidManifest中註冊您的應用程序類。XML:

<application 
     android:name="your.app.package.MyApplication" 
     android:icon="@drawable/icon" 
     android:label="@string/app_name" > 

的onPause和的onResume添加到每個活動項目:

@Override 
protected void onResume() { 
    super.onResume(); 
    MyApplication.activityResumed(); 
} 

@Override 
protected void onPause() { 
    super.onPause(); 
    MyApplication.activityPaused(); 
} 

在你finish()方法,你想用isActivityVisible()以檢查活動是可見或不。在那裏你也可以檢查用戶是否選擇了一個選項。當兩個條件都滿足時繼續。

+0

那個方法是什麼類的一部分? (編輯:谷歌說,它連接到一個片段,我沒有在任何地方使用片段) – rycirese

+0

@rycirese viewpager屏幕中的類是什麼類型?我通常將這種方法用於我的「片段」。你的聽起來像你正在使用'活動' – TranHieu

+0

正確,所有這些活動,是一個視圖。 – rycirese

相關問題