Фрагмент в ViewPager с использованием FragmentPagerAdapter пуст во второй раз, когда он просматривается - PullRequest
95 голосов
/ 13 октября 2011

У меня есть интерфейс фрагментов с вкладками внизу, которые открывают различные фрагменты в главном окне.

У меня есть один конкретный фрагмент, который представляет собой список предметов. Если пользователь выбирает один из элементов в этом списке, открывается другой фрагмент, который содержит вьюгер, который прокручивает по горизонтали между всеми элементами в списке в предыдущем фрагменте. Это прекрасно работает.

ViewPager использует FragmentPagerAdapter для отображения элементов.

Проблема возникает, когда пользователь выбирает элемент в списке, просматривает его, затем нажимает кнопку на панели вкладок, чтобы вернуться к списку, а затем выбирает другой элемент. При втором выборе элемента вместо окна просмотра появляется пустой экран. Когда это происходит, я не получаю ошибок в LogCat.

Почему виджет отображается только в первый раз?

FragmentPagerAdapter:

public class ViewPagerAdapter extends FragmentPagerAdapter {
    Cursor mCursor;

    public ViewPagerAdapter(FragmentManager fm, Cursor c) {
        super(fm);
        mCursor = c;
    }

    public void changeCursor(Cursor c) {
        mCursor = c;
        this.notifyDataSetChanged();
    }

    @Override
    public int getCount() {
        if (mCursor == null) return 0;
        else return mCursor.getCount();
    }

    @Override
    public Fragment getItem(int position) {
        mCursor.moveToPosition(position);
        return TeamCardFragment.newInstance(mCursor, position);
    }
}

PagerFragment:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    Bundle bundle = getArguments();
    mCursorPosition = bundle.getInt(TeamCardCommon.BUNDLE_KEY_CURSOR_POSITION);

    View mView = inflater.inflate(R.layout.team_card_master, container, false);
    mViewPager = (ViewPager)mView.findViewById(R.id.team_card_master_view_pager);

    mAdapter = new ViewPagerAdapter(getFragmentManager(), cursor);
    new setAdapterTask().execute();

    return mView;
}

private class setAdapterTask extends AsyncTask<Void, Void, Void> {
    protected Void doInBackground(Void... params) {
        return null;
    }

    @Override
    protected void onPostExecute(Void result) {
        mViewPager.setAdapter(mAdapter);
        mViewPager.setCurrentItem(mCursorPosition);
    }
}

Ответы [ 12 ]

0 голосов
/ 04 августа 2017

У меня было то же самое, во второй раз, когда я вызываю адаптер пейджера, дочернее представление возвращает исключение NullPointerException.И замена адаптера в FragmentStatePagerAdapter также решает мою проблему.

0 голосов
/ 24 июля 2016

Вы также можете инициализировать адаптер для случаев, когда вы сталкиваетесь с этой ошибкой, когда ваше приложение свернуто и позже вызвано.

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    Bundle bundle = getArguments();
    mCursorPosition = bundle.getInt(TeamCardCommon.BUNDLE_KEY_CURSOR_POSITION);
    View mView = inflater.inflate(R.layout.team_card_master, container, false);
    mViewPager = (ViewPager)mView.findViewById(R.id.team_card_master_view_pager);
    initViewPagerAdapter();
    return mView;
}
private void initViewPagerAdapter(){
    mAdapter = new ViewPagerAdapter(getFragmentManager(), cursor);
    new setAdapterTask().execute();
}

@Override
public void onResume(){
    super.onResume();
    initViewPagerAdapter();
}
...