我對FragmentPagerAdapter
不熟悉,所以這將成爲我們(您)嚴格閱讀說明的那些問題之一。帶有ViewPager和兩個碎片的FragmentPagerAdapter。轉到第一個並更新第一個文本
結構:我有一個FragmentPagerAdapter
(代碼如下),它將一次容納兩個片段。第一個顯示書籍摘錄,第二個顯示書名。
目標:我想達到的目標是在標題中描述:用戶可以導航到尋呼機的第二個片段,點擊標題,然後我想用戶移回第一片段和告訴第一個片段更新文本。第一個片段有一個triggerRefresh
方法。
代碼:我相信我的問題發生,因爲FragmentPagerAdapter
重用/創建片段(我不明白)的方式。這是我的課:
static class MyFragmentPagerAdapter extends FragmentPagerAdapter {
public MyFragmentPagerAdapter(FragmentManager fm) {
super(fm);
}
@Override
public int getCount() {
return NUM_ITEMS;
}
@Override
public Fragment getItem(int position) {
switch(position) {
case 0:
return new ExcerptsFragment();
case 1:
return new BookListFragment();
default:
throw new IllegalArgumentException("not this many fragments: " + position);
}
}
}
我這是怎麼產生的相關成員:
ViewPager mViewPager = (ViewPager) findViewById(R.id.pager);
MyFragmentPagerAdapter mFragmentPagerAdapter = new MyFragmentPagerAdapter(getSupportFragmentManager());
mViewPager.setAdapter(mFragmentPagerAdapter);
而這就是我在我的活動其他地方試行,當我從書名收到回調片段與標題選擇:
mViewPager.setCurrentItem(0); // back to excerpts screen page. It's OK.
// Here's the problem! How to identify the fragment 0
// to ExcerptsFragment and call its triggerRefresh()?!?
問題系列:
調用適配器的getView()
將不起作用,因爲它將返回一個ExcerptsFragment
的新實例,它不是當前附加的實例(如預期的那樣引發異常)。
我在這裏見過很多人(example)只是在getView()
存儲片段。是對的嗎?因爲通過查看官方示例,對我來說看起來像是一種反模式(通過持有物品來擊敗自動引用)。這也是意見here和here(看起來對我來說)。
有什麼建議嗎?我不會感到驚訝,如果我不瞭解所有這一點...
您不應該依賴與分配標籤的內部機制的兼容性。看到我的答案類似的問題如何正確地做到這一點:http://stackoverflow.com/questions/14035090/how-to-get-existing-fragments-when-using-fragmentpageradapter/41345283#41345283 – morgwai 2016-12-27 13:37:54
@morgwai謝謝你的警告我。我收錄了一份免責聲明,以警告潛在的讀者。 – davidcesarino 2016-12-27 19:50:22
歡迎您:)我認爲最好是直接提供一個鏈接到我的答案(不僅僅是這個問題),因爲我的答案是非常新的,因此仍然得分很低,所以讀者可能會堅持2個頂部之一得分的答案,兩者都有問題。 (我爲我的答案添加了一些解釋,爲什麼重寫'instantiateItem'的解決方案本身可能不夠) – morgwai 2016-12-28 06:48:43