gpt4 book ai didi

android - ViewPager getChildCount 返回零

转载 作者:行者123 更新时间:2023-11-29 17:16:46 31 4
gpt4 key购买 nike

有谁知道什么可能导致 viewPager.getChildCount() 返回零?我在 onCreate 中执行了 findViewById,并且我还执行了 viewPager.setAdaptertabLayout.setupWithViewPager(viewPager)。然后在 onResume 中我记录了 child 的数量,它是零!这是为什么?

哦,顺便说一句,尽管 getChildCount 返回 0,ViewPager 的布局显示没有问题。

我的印象是,在我调用 viewPager.setAdapter(pagerAdapter) 之后,ViewPager 和 PagerAdapter 将具有相同的计数。但显然那不是真的。那么,为什么会发生这种情况?

更新

你们提出了一些非常好的观点。谢谢。目标是我想遍历我的 ViewPager/PagerAdapter 中的所有 fragment 。当我使用 getChildCount 时,它通常在意想不到的时候为 0,但当它为非零时一切正常。

for(int i=0; i<viewPager.getChildCount(); i++){
MyFragmentInterface frag = pagerAdapter.getRegisteredFragment(i);
. . .
}

但是,当我使用 viewPager.getAdapter().getCount() 时,该值始终与 pagerAdapter.getCount() 相同。但我倾向于得到 NullPointerException,因为显然还没有 fragment 。

for(int i=0; i<viewPager.getAdapter().getCount(); i++){
MyFragmentInterface frag = pagerAdapter.getRegisteredFragment(i);
. . .
}

回答

我似乎已经修复了它

for(int i=0; i<pagerAdapter.getCount(); i++){
Fragment frag = pagerAdapter.getItem(i);
. . .
}

不再有 NullPointerException 或大小为 0

最佳答案

据我所知ViewPager没有实现这个方法

ViewPager.getChildCount() == ViewGroup.getChildCount()

但是如你所见:

public abstract class ViewGroup extends View implements ViewParent, ViewManager {


// Number of valid children in the mChildren array, the rest should be null or not
// considered as children
private int mChildrenCount

/**
* Returns the number of children in the group.
*
* @return a positive integer representing the number of children in
* the group
*/
public int getChildCount() {
return mChildrenCount;
}

它返回一个 mChildren 计数 - View 组 subview 的计数**

简而言之:

** 这意味着任何 subview (与寻呼机的对象/项目不同)

进一步查看方法:

ViewPager.populate(int newCurrentItem)

ViewPager 依赖于 TabLayout - 所以术语项目是映射到 View 寻呼机适配器项目(可以是 fragment 或 View )的“tablayout”选项卡

因为您可以向任何 View 添加 subview - 这与向其添加 View 寻呼机项目不同 - 您可以使用类似

        [   T1   ][   T2   ][   T3   ]   <- tab layout 
< -- > |----------------------------|
pager |[ pager item ] | < - fragment as view pager item
(view) |----------------------------|
< -- > |[ child view of pager ]| < - child view of pager

Thanks for the education, friend. +1. Do you know how I might solve the problem of iterating through my fragments? – Nouvel Travay

迭代:??嗯,让我想想....

也许获取数组并迭代 ???

1) 通过循环 :)

List<Fragment> fragments = getAdapter().getArrayOfFragments();

for(Fragment fragment : fragments) {

String title = fragment.getTitle();

}

2) 或通过迭代器 :))

List<Fragment> fragments = some implementation of List interface;

Iterator<Fragment> iterator = fragments.iterator();
while(iterator.hasNext()) {

Fragment fragment = iterator.next();
}

提示获取数组的最简单方法?:

 // its only a hint how  - not solution - class need override methods from base class 
class MyAdapter extends BaseAdapter {

private List<Items> _items;
public List<Items> getItems() { return _items; }

MyAdapter(List<Items> items)
_items = items;
}

}

// set
ViewPager.setAdapter(new MyAdapter(listOfItems);
// retrieve
Adapter adapter = ViewPager.getAdapter();
if(adapter != null && MyAdapter.class.isAssignableFrom(adapter.getClass()) {
// magic
MyAdapter myadapter = (MyAdapter) adapter;
List<Items> myList = myAdapter.getItems()
}

附言。抱歉打字错误,我不懂英语,我是实时机器人 :D

TODO FOR YOU(今天)

  • 一般阅读 java 语言
  • 数据类型、类、接口(interface)
  • 继承
  • 附言。我忘了泛型

然后尝试编写简单的类,它继承自其他类并实现一个 mhhh这个界面:

/**
* Created by ceph3us on 03.09.2015.
*/
public interface IListAdapter<T> extends ListAdapter{
void add(T listElement);
void addAll(List<T> listOfElements);
void clear();
void remove(T listElement);
void notifyDataSetChanged();
T getItem(int position);
List<T> getList();
}

至于你的情况:)

您有一个 holder [在 java 术语“定义”中] 用于 fragment 数组(原始)

private Fragment registeredFragments[] = new Fragment[FRAGMENT_TITLES.length];

当你填充这个数组时??

@Override
public Fragment getItem(int position) {
switch (position) {
case 0:
return DogsFragment.newInstance(); <- ?? **here** ??

我想 ?? :)

也许尝试调整像??

        case 0:
// if my array contains this type of fragment return it
// else make new one ??? and pack to this array ???
return DogsFragment.newInstance();

第二件事是实例化这个 holder ???

[FRAGMENT_TITLES.length] ??制作数组??什么尺寸 ???

不要为此使用原始数组(当你添加新 fragment 时要提前考虑 - 作为新手尝试使用列表 - 在这个级别它会节省你寻找许多问题解决方案的时间....

我再说一遍阅读关于接口(interface)的特别是关于一个命名的接口(interface)

 List

关于android - ViewPager getChildCount 返回零,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38492210/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com