如何获取ViewPager特定项的子视图?

26

我将尽可能地让问题简洁明了。

View activeView = mViewPager.getChildAt(mViewPager.getCurrentItem());

如果当前项为 0 或 1,则返回子视图,但如果当前项为 2,则返回 null。为什么会这样呢?

编辑:让我重新表达一下。如何获取 ViewPager 在任何给定项位置的子 View?

5个回答

32

原来getChildAt(int)并不是正确的方法。我的做法是获取ViewPager中使用的适配器,然后从适配器中找到我的视图:

事实证明,getChildAt(int)不是正确的方法。我所做的是检索ViewPager中使用的适配器,然后从那里找到我的视图:

adapter = mViewPager.getAdapter();
Fragment fragment = adapter.getItem(mViewPager.getCurrentItem());

View activeView = fragment.getView();

如前所述,ViewPager 只包含当前子级和相邻的子级(currentItem() +/- 1),除非通过 setOffscreenPageLimit() 进行其他指定。


23
提醒现在进来的任何人,getItem不再是pagerAdapter上的一个方法。 - Vic Vuci
2
@Ronnie Troj,我在activeView中得到了null值,为什么? - Erum
使用此代码时收到一个非法状态异常:"Fragment MyFragment未附加到Activity"。 - worked
2
请使用 @Erum 调用 adapter.instantiateItem(mViewPager, mViewPager.getCurrentItem()); 而不是 getItem。 - Yaroslav

7
你的视图页适配器最多保留2页,即2个视图/片段,其余的将被回收。另外一种情况是,ViewPager中可能有2页/视图,但你没有提及。请查看mViewPager.setOffscreenPageLimit()。

3

很好。看起来正是我想要的,能够动态填充视图。谢谢!! - anand krish

0

在寻找一种装饰Android视图的方法时,我认为我已经为OP的问题定义了另一种解决方案,并在我的博客中进行了记录。由于代码似乎有点太多了,因此我将链接到它。

我提出的解决方案:

  • 保持适配器和视图完全分离
  • 可以轻松查询视图页面中任何索引的视图,如果此视图当前未加载,则会返回null或相应的视图。

(这个问题与这个问题非常简单,我已经发布了相同的答案)。


-1

子视图应该有多少个?

另外,ViewPager并不会同时加载所有子视图。它只会加载当前正在显示的和下一个子视图。您可以使用mViewPager.setOffscreenPageLimit()来预加载更多项目到ViewPager中,例如3或4。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接