1. ホーム
  2. android

[解決済み] FragmentPagerAdapterを使ったViewPagerで、2回目に表示したときにフラグメントが空白になる。

2022-12-15 06:12:56

質問

フラグメントインターフェースの下にタブがあり、メインビューで異なるフラグメントを開くことができます。

私は、項目のリストである1つの特定のフラグメントを持っています。 ユーザーがこのリストの項目の 1 つを選択すると、別のフラグメントが開き、前のフラグメントのリストのすべての項目間を水平にスクロールするビューページャーが含まれます。 これは素晴らしい機能です。

ビューページャーはFragmentPagerAdapterを使用して項目を表示します。

問題は、ユーザがリスト内のアイテムを選択し、それを表示し、タブバーのボタンを押してリストに戻り、別のアイテムを選択したときに発生します。 2 回目に項目が選択されると、ビュー ページの代わりに空白の画面が表示されます。 これが起こったとき、私の LogCat では何のエラーも発生しません。

なぜビューページャーは最初の 1 回だけ表示されるのですか?

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);
    }
}

どのように解決するのですか?

ビューページャーの項目をフラグメントではなく標準のビューとして再実装し、それに応じてアダプタを変更することで回避しました。