为了账号安全,请及时绑定邮箱和手机立即绑定

没有更新视图的ViewPager PagerAdapter

没有更新视图的ViewPager PagerAdapter

蛊毒传说 2019-06-05 16:38:09
没有更新视图的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;         }
查看完整描述

3 回答

?
四季花海

TA贡献1811条经验 获得超5个赞

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

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

覆盖getItemPosition在你的PagerAdapter就像这样:

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

这样,当你打电话的时候notifyDataSetChanged(),视图寻呼机将删除所有视图并重新加载它们。这样就得到了再加载效应。

第二种选择,阿尔瓦罗·路易斯·布斯塔曼特(以前为阿尔瓦罗),是为了setTag()方法instantiateItem()实例化新视图时。然后,而不是使用notifyDataSetChanged(),你可以用findViewWithTag()若要找到要更新的视图,请执行以下操作。

第二种方法非常灵活和高性能。对阿尔瓦罗布的最初研究表示赞许。


查看完整回答
反对 回复 2019-06-05
?
繁华开满天机

TA贡献1816条经验 获得超4个赞

我不认为在PagerAdapter..问题是,理解它的工作原理有点复杂。在这里解释的解决方案中,存在一个误解,因此在我看来实例化视图的用法很差。

最近几天我一直在工作PagerAdapterViewPager,我发现如下:

这个notifyDataSetChanged()方法的PagerAdapter只会通知ViewPager底层页面已经改变。例如,如果已动态创建/删除页(从列表中添加或删除项),则ViewPager应该处理好这件事。在这种情况下我认为ViewPager属性确定是否应删除或实例化新视图。getItemPosition()getCount()方法。

我觉得ViewPager,在.之后notifyDataSetChanged()调用获取它的子视图,并使用getItemPosition()..如果对于子视图,此方法返回POSITION_NONEViewPager理解该视图已被删除,并调用destroyItem(),并移除此视图。

以这种方式,覆盖getItemPosition()总是回来POSITION_NONE如果只想更新页面的内容,则完全错误,因为以前创建的视图将被销毁,每次调用时都会创建新的视图。notifyDatasetChanged()..对一些人来说,这似乎并不是什么错。TextView但是,当您有复杂的视图时,比如从数据库中填充的ListViews,这可能是一个真正的问题,也是对资源的浪费。

因此,有几种方法可以有效地更改视图的内容,而不必再次删除和实例化视图。这取决于你想要解决的问题。我的方法是使用setTag()中的任何实例化视图的instantiateItem()方法。因此,当您想要更改数据或使所需的视图无效时,可以调用findViewWithTag()方法的ViewPager要检索先前实例化的视图,并根据需要修改/使用它,而不必每次要更新某个值时都要删除/创建一个新视图。

想象一下,例如,您有100页和100页。TextViewS,您只想定期更新一个值。使用前面解释的方法,这意味着您正在移除和实例化100。TextViews每次更新。没有道理.。


查看完整回答
反对 回复 2019-06-05
?
精慕HU

TA贡献1845条经验 获得超8个赞

更改FragmentPagerAdapterFragmentStatePagerAdapter.

覆盖getItemPosition()方法与回报POSITION_NONE.

最终,它会听到notifyDataSetChanged()在查看呼机上。


查看完整回答
反对 回复 2019-06-05
  • 3 回答
  • 0 关注
  • 908 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信