ViewPager getChildCount возвращает ноль

Кто-нибудь знает, что может заставить viewPager.getChildCount() вернуть ноль? Я делаю findViewById внутри onCreate, и там я также делаю viewPager.setAdapter и tabLayout.setupWithViewPager(viewPager). Затем внутри onResume я регистрирую счетчик детей и равен нулю! Почему это?

О, кстати, макет ViewPager не вызывает проблем, хотя getChildCount возвращает 0.

У меня создалось впечатление, что после вызова viewPager.setAdapter(pagerAdapter) у ViewPager и PagerAdapter будет одинаковый счет. Но ясно, что это не так. Так почему это может произойти?

UPDATE

Вы, ребята, поднимаете очень хорошие моменты. Спасибо. Цель состоит в том, что я хочу перебирать все фрагменты в моем 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 или размер 0

Ответ 1

Насколько я знаю, 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 count - просмотр дочерних представлений группы представлений **

так короче:

** это означает любое дочернее представление (это не то же самое, что объект/элемент пейджера)

далее см. метод:

ViewPager.populate(int newCurrentItem)

ViewPager полагается на TabLayout - поэтому элемент term является вкладкой tablayout, отображаемой для просмотра элемента адаптера пейджера (может быть фрагментом или представлением)

поскольку вы можете добавить дочерние представления в любое представление - это не то же самое, что добавить к нему элемент пейджера представления - вы можете иметь что-то вроде

        [   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

итерации:?? mhh дайте мне подумать....

может быть массив и итерация???

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 ДЛЯ ВАС (СЕГОДНЯ)

  • Общие сведения о языке Java
  • типы данных, классы, интерфейсы
  • наследование
  • пс. я забыл о дженериках.

затем попробуйте написать простой класс, который наследуется от другого класса и реализует 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 term "definition" ] для массива (примитивный) фрагментов

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

, когда u заполнить этот массив

@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]?? сделать массив? какой размер???

не используйте для этого примитивный массив (подумайте, когда u добавит новый фрагмент - как новичок попробует использовать список) на этом уровне Это сэкономит вам время на поиск решений для многих проблем....

Я говорю это еще раз, ЧИТАЙТЕ О ИНТЕРФЕЙСАХ ESPECIAL ON ONE, названном

 List