1

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

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被处理,所以视图不能更新。

4

2 回答 2

1

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

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

请参阅本主题以获取更多信息:

动态更新 ViewPager?

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

编辑

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

@Override
public int getItemPosition(Object object) {
    return POSITION_NONE;
}
于 2012-06-21T19:51:56.137 回答
0

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

public void notifyDatasetChanged() {
    if (mPager != null && mAdapter != null) {
        initTabs();
        measure(mWidthMeasureSpec, mHeightMeasureSpec);
        calculateNewPositions(true);
    }
}
于 2012-06-21T19:45:58.550 回答