android-fragments - 在ViewPager中使用FragmentPagerAdapter的android fragment 在第二次被查看

  显示原文与译文双语对照的内容
146 4

我有一个 fragment 接口,底部带有选项卡,它在主视图中打开不同的Fragments 。

我有一个特殊的fragment,它是一个项目列表。如果用户选择这里列表中的一项,则打开另一个 fragment,它的中包含在前面的fragment 中的列表中滚动的viewpager 。这很有用。

viewpager使用FragmentPagerAdapter来显示项目。

当用户在列表中选择一个项目,查看它,然后点击选项卡栏上的按钮,然后选择另一个项目。第二次选择项目时,将显示一个空白屏幕,而不是 viewpager 。我在测试过程中没有收到任何错误。

为什么viewpager只出现在第一次出现的时候?

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);
 }
}
时间:原作者:0个回答

92 1

我也有同样的问题从from更改PageAdapter的父类android.support.v4.app.FragmentPagerAdapterandroid.support.v4.app.FragmentStatePagerAdapter在"第二次"上解决我的ViewPager 显示问题 !

原作者:
56 1

我通过在父 fragment 中用 getChildFragmentManager() 替换 getFragmentManager() 来解决这个问题。这个父 fragment 实例化了 android.support.v4.app.FragmentPagerAdapter,为了包含可以分页的( slideable ) Fragments,这需要构造函数中的fragment manager 。对于这个构造函数,我传递了 getChildFragmentManager()的返回值。

hackbod链接是关键( https://developer.android.com/about/versions/android-4.2.html#NestedFragments ),在 Fragments 中的 Fragments 中找到。

原作者:
...