Android ViewPager - доступ к просмотру внутри текущей страницы вызывает NPE

Я использую android.support.v4.view.ViewPager и заметил, что после установки моего android.support.v4.app.FragmentStatePagerAdapter на ViewPager в методе onStart() моей активности я не могу получить представление о отображаемая в данный момент страница ViewPager, потому что она, похоже, еще не инициализирована/прикреплена/нарисована к действию. Я всегда получаю NPE.

Есть ли событие, которое запускается, когда мой ViewPager полностью инициализирован, включая его страницы фрагментов и их представления?

Мой код в методе onStart() основного действия выглядит примерно так:

ViewPager vp = findViewById(R.id.viewPager);
vp.setAdapter(new FlashCardPagerAdapter(getSupportFragmentManager()));
vp.getChildCount(); //this is still 0 because the child fragments have not been added yet, why? When are they added?

Мой адаптер выглядит так:

public class FlashCardPagerAdapter extends FragmentStatePagerAdapter {

    private List<FlashCard> flashCards;
    private FlashCardFragment[] flashCardFragments;

    public FlashCardPagerAdapter(FragmentManager fm) {
        super(fm);

        flashCards = FlashCardApp.getInstance().getFlashCards();
        flashCardFragments = new FlashCardFragment[flashCards.size()];
    }

    @Override
    public Fragment getItem(int i) {
        if (flashCardFragments[i] != null) {
            return flashCardFragments[i];
        } else {
            flashCardFragments[i] = new FlashCardFragment(flashCards.get(i));
            return flashCardFragments[i];
        }
    }

    public FlashCardView getFlashCardViewAt(int i) {
        return ((FlashCardFragment) getItem(i)).getFlashCardView();
    }

    @Override
    public int getCount() {
        return 25;
    }
}

Спасибо за любую помощь.

РЕДАКТИРОВАТЬ Дело в том, что все это работает, когда я вызываю его после метода onStart(), например, в одном из моих пользовательских представлений кнопок.


person crisi    schedule 25.10.2013    source источник


Ответы (1)


Я предполагаю, что vp.setAdapter(new MyAdapter()); это просто опечатка, и вы хотели сказать vp.setAdapter(new FlashCardPagerAdapter(getSupportFragmentManager()));

Если это не сработает, то по какой-то причине он возвращает 0 страниц. Я бы проверил метод адаптера getCount(), чтобы убедиться, что он возвращает нечто большее, чем 0, потому что именно так программа просмотра решает, сколько страниц показывать.

person Gak2    schedule 25.10.2013
comment
Да это опечатка. Я починил это. Мой метод getCount() работает, как и ожидалось, и возвращает значение 25. - person crisi; 25.10.2013
comment
это может быть как-то связано с тем, что вы используете FragmentStatePagerAdapter вместо FragmentPagerAdapter? Я знаю, что предыдущий не хранит все представления в памяти, в отличие от последнего. Кроме того, вы используете метод getFlashCardViewAt() адаптера или метод просмотра страницы для получения представления? - person Gak2; 25.10.2013