Android:FragmentAdapter 和 pageview 不更新视图

Posted

技术标签:

【中文标题】Android:FragmentAdapter 和 pageview 不更新视图【英文标题】:Android: FragmentAdapter and pageview do not update the view 【发布时间】: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被处理,所以视图不能更新。

【问题讨论】:

【参考方案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);
    

【讨论】:

以上是关于Android:FragmentAdapter 和 pageview 不更新视图的主要内容,如果未能解决你的问题,请参考以下文章

Android开发技巧——PagerAdapter实现类的封装

Android开发技巧——ViewPager加View情况封装PagerAdapter的实现类

Android移动应用开发之Viewpage2+fragment实现微信滑动界面的效果

ViewPager Activity 通知特定事件的 Fragment

cathome 猫家 开发日记-tablayout+viewpager+fragment

android和Linux的区别?