【问题标题】:Android: FragmentAdapter and pageview do not update the viewAndroid:FragmentAdapter 和 pageview 不更新视图
【发布时间】:2012-06-19 04:55:25
【问题描述】:

我的麻烦是:当我获得新数据时,使用我的自定义适配器的 viewpager 不会更新视图。我发现许多程序员都有同样的错误,所以我尝试了很多建议,但对我没有任何帮助。很累。再来一次,阅读我的源代码并帮助我理解为什么我更新视图失败了! 这是我的 FragmentAdapter:

private class SwipeyTabsPagerAdapter extends FragmentPagerAdapter implements
        SwipeyTabsAdapter {

    private final Context mContext;
    private String[] datas;

    public SwipeyTabsPagerAdapter(Context context, FragmentManager fm, String[] ds) {
        super(fm);
        this.mContext = context;
        datas=ds;
    }

    @Override
    public int getItemPosition(Object object) {
        return POSITION_NONE;
    }

    @Override
    public Fragment getItem(int position) {
        Log.e("new item:", datas[position]);
        return SwipeyTabFragment.newInstance(datas[position]);
    }

    @Override
    public int getCount() {
        return datas.length;
    }

    public TextView getTab(final int position, SwipeyTabs root) {
        TextView view = (TextView) LayoutInflater.from(mContext).inflate(
                R.layout.swipey_tab_indicator, root, false);
        view.setText(datas[position]);
        view.setOnClickListener(new OnClickListener() {
            public void onClick(View v) {
                mViewPager.setCurrentItem(position);
            }
        });

        return view;
    }

}

这是我设置适配器的地方:

SwipeyTabsPagerAdapter adapter = new SwipeyTabsPagerAdapter(getApplicationContext(), getSupportFragmentManager(),dicts);
            mViewPager.setAdapter(adapter);
            mTabs.setAdapter(adapter);
            mViewPager.getAdapter().notifyDataSetChanged();

通过logcat可以清楚的看到:只是第一次,newItem被处理,所以视图不能更新。

【问题讨论】:

    标签: android adapter fragment


    【解决方案1】:

    我也遇到了这个问题,尝试了我在互联网上找到的所有内容,但没有成功。

    有效的解决方案是使用 FragmentStatePagerAdapter 而不是 FragmentPagerAdapter。 FragmentPagerAdapter 似乎是“不可变的”(至少它的行为方式是这样)。

    更多信息请查看此帖:

    Update ViewPager dynamically?

    另一种可行但不好的解决方案是每次都重新实例化所有内容(ViewPager、Adapter),以编程方式删除旧的并添加新的。

    编辑

    我忘记了适配器中的一些重要内容你也必须添加这个方法:

    @Override
    public int getItemPosition(Object object) {
        return POSITION_NONE;
    }
    

    【讨论】:

      【解决方案2】:

      在您的 mTab​​ 上也调用 notifyDataSetChanged()。在 SwipeyTabsView 类中查看该方法的实现:

      public void notifyDatasetChanged() {
          if (mPager != null && mAdapter != null) {
              initTabs();
              measure(mWidthMeasureSpec, mHeightMeasureSpec);
              calculateNewPositions(true);
          }
      }
      

      【讨论】:

        猜你喜欢
        • 2020-02-17
        • 2019-09-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-07-04
        • 1970-01-01
        • 2020-04-15
        • 2013-10-23
        相关资源
        最近更新 更多