ViewPager不会重新绘制内容,保持/变为空白。

12 浏览
0 Comments

ViewPager不会重新绘制内容,保持/变为空白。

我们在使用ViewPager时遇到了一个非常奇怪的问题。我们在每个ViewPager页面上嵌入了列表,并在更新列表数据时同时触发list adapter和view pager adapter的notifyDataSetChanged方法。

我们观察到的情况是,有时页面不会更新其视图树,即保持空白,甚至有时在翻页到该页面时会消失。当来回翻页几次后,内容会突然重新出现。看起来好像Android在这里错过了视图更新。我还注意到,在使用层次结构查看器进行调试时,选择一个视图总是会使它重新出现,显然是因为层次结构查看器强制选择的视图重新绘制自己。

然而,我无法通过编程使其工作;无效化列表视图,甚至整个view pager,都没有效果。

这是使用compatibility-v4_r7库时出现的。我还尝试使用最新版本,因为它声称修复了许多与view pager相关的问题,但情况变得更糟(例如,手势被破坏,有时候它不允许我浏览所有页面)。

还有其他人遇到这些问题吗?或者你们对可能引起这个问题有什么想法吗?

0
0 Comments

问题的原因是在destroyItem方法中错误地使用了viewPager.removeViewAt(index)来销毁视图,而正确的方法应该是使用viewPager.removeView((View) object)来销毁视图。

解决方法是将destroyItem方法中的viewPager.removeViewAt(position)修改为viewPager.removeView((View) object)。

这个问题的解决方法对我起到了作用,但你知道为什么第一个方法会有问题吗?

removeViewAt方法将删除ViewPager当前子视图列表中指定位置的视图,而页面可以以任何顺序添加到ViewPager中(所以第0页实际上可能在ViewPager的索引1处或其他位置)。removeView方法会迭代子视图列表,并且只会删除指定的对象。

对我来说没有起作用:无法将视图强制转换为片段。这里的对象是一个片段。

viewpager必须是静态的吗?

0
0 Comments

问题的原因是:我们的实现存在两个问题:

1. 我们的适配器在destroyItem()方法中没有移除视图。

2. 我们在缓存视图,以便只需一次性填充布局,但是由于我们没有在destroyItem()中移除视图,所以在instantiateItem()中也没有添加视图,而是只返回与当前位置对应的缓存视图。

解决方法是:根据文档,我们的适配器在instantiateItem()和destroyItem()中必须显式地添加/移除视图。另外,如果在ViewPager中使用列表,请注意链接中提到的问题。另外,有人可能使用了getFragmentManger而不是GetChildFragmentManager,这也可能导致问题。

我遇到了相同的问题,但是使用的是FragmentPagerAdapter,它会自动处理onDestroy。这里提供的其他解决方法也没有起作用。

总结起来,问题的原因是适配器没有在instantiateItem()和destroyItem()中显式地添加/移除视图,解决方法是确保在适配器中实现这个逻辑。另外,需要注意在ViewPager中使用列表的情况,以及正确使用FragmentManager。

0
0 Comments

问题出现的原因:在使用FragmentPagerAdapter时,如果将ViewPager放置在一个Fragment中,需要使用getChildFragmentManager()方法来初始化FragmentPagerAdapter,而不是使用getSupportFragmentManager()方法。

解决方法:将初始化FragmentPagerAdapter时的参数改为getChildFragmentManager()。

整理后的文章内容如下:

如果将ViewPager放置在一个使用FragmentPagerAdapter的Fragment中,需要使用getChildFragmentManager()方法来初始化FragmentPagerAdapter,而不是使用getSupportFragmentManager()方法。

示例代码如下:

mAdapter = new MyFragmentPagerAdapter(getChildFragmentManager());

而不是:

mAdapter = new MyFragmentPagerAdapter(getSupportFragmentManager());

一位用户表示,使用getChildFragmentManager()方法解决了他在使用FragmentPagerAdapter时遇到的问题。

另一位用户也表示,他之前尝试在重新创建的Fragment中强制调用FragmentPagerAdapter的getItem()方法,而使用了getChildFragmentManager()方法后问题得到了解决。

还有一位用户认为,问题的原因可能是在Fragment中使用了ViewPager的布局。

使用getChildFragmentManager()方法来初始化FragmentPagerAdapter可以解决该问题。

0