Кто-нибудь знает, что может заставить 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
Насколько я знаю, 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 ДЛЯ ВАС (СЕГОДНЯ)
затем попробуйте написать простой класс, который наследуется от другого класса и реализует 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