У меня есть FragmentPagerAdapter. Его метод getItem
может возвращать фрагмент в соответствии с данными, полученными извне. После того, как я обновлю данные, которые должны отображаться, я вызываю notifyDataSetChanged
, но ничего не произошло. Я ДЕЙСТВИТЕЛЬНО переопределил метод getItemPosition
, чтобы вернуть POSITION_NONE
:
public static class TabsAdapter extends FragmentPagerAdapter implements TabHost.OnTabChangeListener,
ViewPager.OnPageChangeListener
{
private final Context mContext;
private final TabHost mTabHost;
private final ViewPager mViewPager;
private final ArrayList<TabInfo> mTabs = new ArrayList<TabInfo>();
private PagerTabsFragments fragmentDisplayInfo = null; // for now only a
// single size
// back
// stack
static class PagerTabsFragments
{
public int tabPosition;
public Fragment fragmentToDisplay;
public Object fragmentInfo;
public PagerTabsFragments(int tab, Fragment frag, Object info)
{
tabPosition = tab;
fragmentToDisplay = frag;
fragmentInfo = info;
}
}
public void SetFragmentToDisplay(int tabPosition, Fragment frag, Object info)
{
fragmentDisplayInfo = new PagerTabsFragments(tabPosition, frag, info);
notifyDataSetChanged();
}
public void CancelFragmentToDisplay()
{
fragmentDisplayInfo = null;
}
...
@Override
public Fragment getItem(final int position)
{
if ((fragmentDisplayInfo != null) && (fragmentDisplayInfo.tabPosition == position))
{
return fragmentDisplayInfo.fragmentToDisplay;
}
final TabInfo info = mTabs.get(position);
return Fragment.instantiate(mContext, info.clss.getName(), info.args);
}
@Override
public int getItemPosition(Object item)
{
if (fragmentDisplayInfo == null)
{
return super.getItemPosition(item);
}
return POSITION_NONE;
}
...
И обновление извне происходит в событии клика, которое устанавливает переменную fragmentDisplayInfo
. Я отладил и увидел, что fragmentDisplayInfo
действительно инициализирован, а метод getItemPosition
действительно возвращает POSITION_NONE
, но метод getItem даже не вызывается. Это почему?
РЕДАКТИРОВАТЬ:
Если вы этого еще не сделали, обратите внимание на эту часть адаптера overiden:
@Override
public int getItemPosition(Object item)
{
return POSITION_NONE;
}