小编典典

ViewPager PagerAdapter 不更新视图

all

我正在使用兼容性库中的 ViewPager。我已经成功地让它显示了几个可以翻页的视图。

但是,我很难弄清楚如何用一组新的视图更新 ViewPager。

我已经尝试了各种方法,例如 call
mAdapter.notifyDataSetChanged()mViewPager.invalidate()甚至每次我想使用新的数据列表时都创建一个全新的适配器。

没有任何帮助,文本视图与原始数据保持不变。

更新: 我做了一个小测试项目,我几乎能够更新视图。我将粘贴下面的课程。

然而,似乎没有更新的是第二个视图,“B”仍然存在,按下更新按钮后它应该显示“Y”。

public class ViewPagerBugActivity extends Activity {

    private ViewPager myViewPager;
    private List<String> data;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        data = new ArrayList<String>();
        data.add("A");
        data.add("B");
        data.add("C");

        myViewPager = (ViewPager) findViewById(R.id.my_view_pager);
        myViewPager.setAdapter(new MyViewPagerAdapter(this, data));

        Button updateButton = (Button) findViewById(R.id.update_button);
        updateButton.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                updateViewPager();
            }
        });
    }

    private void updateViewPager() {
        data.clear();
        data.add("X");
        data.add("Y");
        data.add("Z");
        myViewPager.getAdapter().notifyDataSetChanged();
    }

    private class MyViewPagerAdapter extends PagerAdapter {

        private List<String> data;
        private Context ctx;

        public MyViewPagerAdapter(Context ctx, List<String> data) {
            this.ctx = ctx;
            this.data = data;
        }

        @Override
        public int getCount() {
            return data.size();
        }

        @Override
        public Object instantiateItem(View collection, int position) {
            TextView view = new TextView(ctx);
            view.setText(data.get(position));
            ((ViewPager)collection).addView(view);
            return view;
        }

        @Override
        public void destroyItem(View collection, int position, Object view) {
             ((ViewPager) collection).removeView((View) view);
        }

        @Override
        public boolean isViewFromObject(View view, Object object) {
            return view == object;
        }

        @Override
        public Parcelable saveState() {
            return null;
        }

        @Override
        public void restoreState(Parcelable arg0, ClassLoader arg1) {
        }

        @Override
        public void startUpdate(View arg0) {
        }

        @Override
        public void finishUpdate(View arg0) {
        }
    }
}

阅读 204

收藏
2022-03-04

共1个答案

小编典典

有几种方法可以实现这一点。

第一种选择更容易,但效率更低。

像这样覆盖getItemPositionPagerAdapter

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

这样,当您调用 时notifyDataSetChanged(),视图寻呼机将删除所有视图并重新加载它们。这样就获得了重装效果。

第二个选项,由 Alvaro Luis Bustamante (previously alvarolb)
建议
,是在实例化新视图时使用setTag()方法。instantiateItem()然后notifyDataSetChanged(),您可以使用findViewWithTag()来查找要更新的视图,而不是使用。

第二种方法非常灵活和高性能。感谢 alvarolb 的原创研究。

2022-03-04