Android:Fragment Adapter和pageview不更新视图

时间:2012-06-16 09:19:32

标签: android adapter fragment

我的麻烦是:当我获得新数据时,使用我的自定义适配器的viewpager不会更新视图。我发现许多程序员都有同样的bug,所以我尝试了很多建议,但没办法对我有用。很累。再一次,阅读我的来源,并帮助我理解为什么我失败了更新视图pleaseee! 这是我的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被处理,所以视图无法更新。

2 个答案:

答案 0 :(得分:1)

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

工作解决方案是使用FragmentStatePagerAdapter而不是FragmentPagerAdapter。 FragmentPagerAdapter似乎是“不可变的”(至少它表现得那样)。

有关更多信息,请参阅此主题:

Update ViewPager dynamically?

另一个有效的解决方案,但不好的是每次重新实例化(ViewPager,Adapter),以编程方式删除旧的并添加新的。

修改

我忘记了适配器中的一些重要内容,您还必须添加此方法:

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

答案 1 :(得分:0)

也在你的mTabs上调用notifyDataSetChanged()。请参阅SwipeyTabsView类中此方法的实现:

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