6

请告诉我如何在 android 上重置 ViewPager 的内容。我试图调用 adapter.notifyDataSetChanged() 但是当我滚动视图时适配器没有调用 getItem(position) 。它总是返回旧的子视图。

更新:这是我的片段视图。当我重置 viewPager 数据时,它使用了加载的片段视图。它只是从 onCreateView 而不是 Constructor 开始。

public class ResultView extends Fragment {
//Declare properties

     //Constructor 
public ResultView(Province province, Calendar calendar) {
    Log.d("xskt", "ResultView constructor");
    this.province = province;
    this.calendar = (Calendar) calendar.clone();
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    Log.d("xskt", "ResultView onCreateView");
    View view = inflater.inflate(R.layout.resultview, null);

    //do some thing

    return view;
}

谢谢。

4

4 回答 4

38

我已经改为使用FragmentStatePagerAdapter而不是FragmentPagerAdapter,问题解决了。希望这可以帮助。

于 2012-12-05T02:21:37.260 回答
2

我认为在另一个片段中重新加载片段的最佳解决方案是:

@Override
public void onPause() {
    super.onResume();
    List<Fragment> fragments = getFragmentManager().getFragments();
    if (fragments != null) {
        FragmentTransaction fragmentTransaction  = getFragmentManager().beginTransaction();
        for (Fragment fragment : fragments) {
            if (fragment instanceof Fragment) {
                fragmentTransaction.remove(fragment);
            }
        }
        fragmentTransaction.commitNowAllowingStateLoss();
    }
}

检查您的用例是否commitNowAllowingStateLosscommitAllowingStateLoss必要。

于 2017-05-21T19:17:59.170 回答
0

一种方法是使用观察者模式。您呈现的数据可能在 sqlite DB 中(或存储在内存中)。您可以在您的片段中设置一个侦听器,当数据更改时,它将对您的片段进行必要的更新。

于 2012-12-04T16:11:48.907 回答
0

如果您执行以下操作,它将起作用:

  • 使 viewPager 无效以使缓存无效
  • 调用 notifyDataSetChanged() 告诉适配器发生了变化,它必须刷新 Fragments
  • 在 FragmentStatePagerAdapter 中覆盖 getItemPosition 以刷新所有 Fragment

在您的 Activity 或您要刷新数据的任何地方:

viewPager.invalidate();
fragmentStatePageAdapter.notifyDataSetChanged();

在你 FragmentStatePageAdapter 中:

@Override
public int getItemPosition(@NotNull Object object) {
    return POSITION_NONE;
}
于 2021-02-10T15:45:45.650 回答