ViewPager getChildCount返回零

时间:2016-07-20 22:57:17

标签: android android-layout android-viewpager

有谁知道可能导致viewPager.getChildCount()返回零的原因?我在onCreate中findViewById,{I} viewPager.setAdaptertabLayout.setupWithViewPager(viewPager)。然后在onResume里面我记录子计数,它是零!那是为什么?

哦,顺便说一句,虽然getChildCount返回0,但ViewPager的布局没有显示任何问题。

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

更新

你们提出了一些非常好的观点。谢谢。目标是我想迭代浏览ViewPager / PagerAdapter中的所有片段。当我使用getChildCount时,它在意外时间通常为0,但是当它不为零时,一切正常。

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

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

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

ANSWER

我似乎用

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

不再有NullPointerException或size 0

1 个答案:

答案 0 :(得分:2)

据我所知,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 计数 - 视图组子视图的数量**

简而言之:

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

进一步看方法:

ViewPager.populate(int newCurrentItem)

ViewPager依赖于TabLayout - 因此术语项是&#34; tablayout&#34;选项卡映射到视图寻呼机适配器项目(可能是片段或视图)

因为您可以将子视图添加到任何视图 - 这与添加视图寻呼机项目不同 - 您可以使用类似

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

感谢教育,朋友。 +1。你知道如何解决迭代我片段的问题吗? - Nouvel Travay

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

也许得到数组并迭代???

1) via loop :)

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()
}

PS。抱歉打字错误我不会&#39;知道英语和我实时的机器人:D

TODO FOR YOU(今天)

  • 关于java语言的一般阅读
  • 数据类型,类,接口
  • 继承
  • PS。我忘了 generics

然后尝试编写从其他类继承并实现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();
}

至于你的情况:)

你有一个持有人 [在java术语&#34;定义&#34; ]对于片段的数组(原始)

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();  

第二件事是这个持有人的实例化

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

不要使用原始数组(想想当你添加新片段时 - 作为新手尝试使用列表 - 在这个级别它将节省你寻找解决许多问题的时间....

我再一次说再谈谈关于一个名字的接口

 List