猿问

没有更新视图的ViewPager PagerAdapter

没有更新视图的ViewPager PagerAdapter

我正在使用兼容性库中的ViewPager。我已经成功地得到了它,显示了我可以浏览的几个视图。

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

我试过各种各样的事情,比如打电话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;
        }


蛊毒传说
浏览 909回答 3
3回答

四季花海

有几种方法可以实现这一点。第一种选择比较容易,但效率更低。覆盖getItemPosition在你的PagerAdapter就像这样:public int getItemPosition(Object object) {     return POSITION_NONE;}这样,当你打电话的时候notifyDataSetChanged(),视图寻呼机将删除所有视图并重新加载它们。这样就得到了再加载效应。第二种选择,阿尔瓦罗·路易斯·布斯塔曼特(以前为阿尔瓦罗),是为了setTag()方法instantiateItem()实例化新视图时。然后,而不是使用notifyDataSetChanged(),你可以用findViewWithTag()若要找到要更新的视图,请执行以下操作。第二种方法非常灵活和高性能。对阿尔瓦罗布的最初研究表示赞许。

繁华开满天机

我不认为在PagerAdapter..问题是,理解它的工作原理有点复杂。在这里解释的解决方案中,存在一个误解,因此在我看来实例化视图的用法很差。最近几天我一直在工作PagerAdapter和ViewPager,我发现如下:这个notifyDataSetChanged()方法的PagerAdapter只会通知ViewPager底层页面已经改变。例如,如果已动态创建/删除页(从列表中添加或删除项),则ViewPager应该处理好这件事。在这种情况下我认为ViewPager属性确定是否应删除或实例化新视图。getItemPosition()和getCount()方法。我觉得ViewPager,在.之后notifyDataSetChanged()调用获取它的子视图,并使用getItemPosition()..如果对于子视图,此方法返回POSITION_NONE,ViewPager理解该视图已被删除,并调用destroyItem(),并移除此视图。以这种方式,覆盖getItemPosition()总是回来POSITION_NONE如果只想更新页面的内容,则完全错误,因为以前创建的视图将被销毁,每次调用时都会创建新的视图。notifyDatasetChanged()..对一些人来说,这似乎并不是什么错。TextView但是,当您有复杂的视图时,比如从数据库中填充的ListViews,这可能是一个真正的问题,也是对资源的浪费。因此,有几种方法可以有效地更改视图的内容,而不必再次删除和实例化视图。这取决于你想要解决的问题。我的方法是使用setTag()中的任何实例化视图的instantiateItem()方法。因此,当您想要更改数据或使所需的视图无效时,可以调用findViewWithTag()方法的ViewPager要检索先前实例化的视图,并根据需要修改/使用它,而不必每次要更新某个值时都要删除/创建一个新视图。想象一下,例如,您有100页和100页。TextViewS,您只想定期更新一个值。使用前面解释的方法,这意味着您正在移除和实例化100。TextViews每次更新。没有道理.。

精慕HU

更改FragmentPagerAdapter到FragmentStatePagerAdapter.覆盖getItemPosition()方法与回报POSITION_NONE.最终,它会听到notifyDataSetChanged()在查看呼机上。
随时随地看视频慕课网APP

相关分类

Android
我要回答