有谁知道可能导致viewPager.getChildCount()
返回零的原因?我在onCreate中findViewById
,{I} viewPager.setAdapter
和tabLayout.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
答案 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(今天)
然后尝试编写从其他类继承并实现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