FragmentPagerAdapter notifyDataSetChanged 不工作
FragmentPagerAdapter notifyDataSetChanged not working
我有一个 FragmentPagerAdapter。它的 getItem
方法可以 return 根据它从外部获得的数据片段。在我更新了它应该显示的数据后,我调用了 notifyDataSetChanged
但什么也没有发生。我确实将 getItemPosition
方法覆盖为 return 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
方法做了 return POSITION_NONE
,但是 getItem 方法甚至没有被调用。这是为什么?
编辑:
如果您还没有这样做,请注意适配器的覆盖部分:
@Override
public int getItemPosition(Object item)
{
return POSITION_NONE;
}
我不确定,但您可以尝试使用 FragmentStatePagerAdapter
而不是 FragmentPagerAdapter
。问题是,我也 运行 关注过这个问题,它帮助了我
Nik Myers 说的是正确的。不过少了一块。调用 notifyDataSetChanged 时,将调用方法 getItemPosition。您需要重写它以重新加载片段。
@Override
public int getItemPosition(Object object) {
// Causes adapter to reload all Fragments when
// notifyDataSetChanged is called
return POSITION_NONE;
}
我在做上一个项目时遇到过类似的问题。
所以我找到了一些解决方案。
通过覆盖寻呼机适配器中的 getItemPosition 但这不是一个好主意。
@Override
public int getItemPosition(Object object) {
// it will recreate all Fragments when
// notifyDataSetChanged is called
return POSITION_NONE;
}
第二个是cabezas解
最稳定的解决方案以以下方式覆盖 getItemPosition:
@Override
public int getItemPosition(Object object) {
if (object instanceof MyFragment) {
// Create a new method notifyUpdate() in your fragment
// it will get call when you invoke
// notifyDatasetChaged();
((MyFragment) object).notifyUpdate();
}
//don't return POSITION_NONE, avoid fragment recreation.
return super.getItemPosition(object);
}
none 上面给出的解决方案对我有用。所以希望以下解决方案对您有所帮助。
在我的代码中,viewPager 中有 2 个片段。一个用于 3 个 EditTexts 和 1 个按钮,另一个片段有 RecyclerView。单击按钮时,我的值将转到 recyclerView,但不会更新。所以现在,我使用了以下代码:
我在单击按钮时调用了 notifyDataSetChanged()。我的 MainActivity 有内部适配器 class extends FragmentStatePagerAdapter class. 所以我用 mainActivity.mMainAdapter.notifyDataSetChanged() 调用它.希望对大家有帮助。
这里的每个答案对我来说都不是完美的,但将多个答案合并为一个是正确的选择。
public final class SomeFragment extends FragmentStatePagerAdapter{
private final List<Fragment> fragments;
private Fragment removeFragment; //Fragment to be removed in the next notifydatasetchanged
@Override
public int getItemPosition(final Object object) {
return object.equals(this.removeFragment) ? FragmentStatePagerAdapter.POSITION_NONE : this.fragments.indexOf(object);
}
}
Return POSITION_NONE 仅适用于您要从 viewpager 中删除的片段。其他每个片段仍在您的片段列表中。在调用 notifyDataSetChanged();
之前,不要忘记从列表中删除 "removeFragment"
对于尝试上述方法后仍然面临刷新问题的用户:
使 viewPager 无效然后调用 notifyDatatSetChanged()
我有一个 FragmentPagerAdapter。它的 getItem
方法可以 return 根据它从外部获得的数据片段。在我更新了它应该显示的数据后,我调用了 notifyDataSetChanged
但什么也没有发生。我确实将 getItemPosition
方法覆盖为 return 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
方法做了 return POSITION_NONE
,但是 getItem 方法甚至没有被调用。这是为什么?
编辑:
如果您还没有这样做,请注意适配器的覆盖部分:
@Override
public int getItemPosition(Object item)
{
return POSITION_NONE;
}
我不确定,但您可以尝试使用 FragmentStatePagerAdapter
而不是 FragmentPagerAdapter
。问题是,我也 运行 关注过这个问题,它帮助了我
Nik Myers 说的是正确的。不过少了一块。调用 notifyDataSetChanged 时,将调用方法 getItemPosition。您需要重写它以重新加载片段。
@Override
public int getItemPosition(Object object) {
// Causes adapter to reload all Fragments when
// notifyDataSetChanged is called
return POSITION_NONE;
}
我在做上一个项目时遇到过类似的问题。 所以我找到了一些解决方案。
通过覆盖寻呼机适配器中的 getItemPosition 但这不是一个好主意。
@Override public int getItemPosition(Object object) { // it will recreate all Fragments when // notifyDataSetChanged is called return POSITION_NONE; }
第二个是cabezas解
最稳定的解决方案以以下方式覆盖 getItemPosition:
@Override public int getItemPosition(Object object) { if (object instanceof MyFragment) { // Create a new method notifyUpdate() in your fragment // it will get call when you invoke // notifyDatasetChaged(); ((MyFragment) object).notifyUpdate(); } //don't return POSITION_NONE, avoid fragment recreation. return super.getItemPosition(object); }
none 上面给出的解决方案对我有用。所以希望以下解决方案对您有所帮助。
在我的代码中,viewPager 中有 2 个片段。一个用于 3 个 EditTexts 和 1 个按钮,另一个片段有 RecyclerView。单击按钮时,我的值将转到 recyclerView,但不会更新。所以现在,我使用了以下代码:
我在单击按钮时调用了 notifyDataSetChanged()。我的 MainActivity 有内部适配器 class extends FragmentStatePagerAdapter class. 所以我用 mainActivity.mMainAdapter.notifyDataSetChanged() 调用它.希望对大家有帮助。
这里的每个答案对我来说都不是完美的,但将多个答案合并为一个是正确的选择。
public final class SomeFragment extends FragmentStatePagerAdapter{
private final List<Fragment> fragments;
private Fragment removeFragment; //Fragment to be removed in the next notifydatasetchanged
@Override
public int getItemPosition(final Object object) {
return object.equals(this.removeFragment) ? FragmentStatePagerAdapter.POSITION_NONE : this.fragments.indexOf(object);
}
}
Return POSITION_NONE 仅适用于您要从 viewpager 中删除的片段。其他每个片段仍在您的片段列表中。在调用 notifyDataSetChanged();
之前,不要忘记从列表中删除 "removeFragment"对于尝试上述方法后仍然面临刷新问题的用户:
使 viewPager 无效然后调用 notifyDatatSetChanged()