android - 嵌套 fragment 内的 Recyclerview 未显示

标签 android android-layout android-fragments android-recyclerview android-viewpager

我有一个包含 viewpager 的 fragment 。 viewpager 本身包含包含 recyclerview 和 textview 的 fragment 。问题是 textview 在所有 5 个选项卡中显示,但 recyclerview 仅在 2-3 个选项卡中显示(随机)。

1.jpg

2.jpg

这是我的代码

父 fragment

@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
toolbar = (Toolbar) fragmentActivity.findViewById(R.id.my_toolbar);
tabLayout = (TabLayout) fragmentActivity.findViewById(R.id.my_tablayout);
mCollapsingToolbarLayout = (CollapsingToolbarLayout)    fragmentActivity.findViewById(R.id.collapsing_toolbar_layout);
viewPager = (ViewPager) fragmentActivity.findViewById(R.id.my_pager);
    ((AppCompatActivity) getActivity()).setSupportActionBar(toolbar);
    ((AppCompatActivity)    getActivity()).getSupportActionBar().setDisplayHomeAsUpEnabled(true);
          adapter = new GameListPagerAdapter(getChildFragmentManager(),getContext());
    viewPager.setAdapter(adapter);
    viewPager.setCurrentItem(1);
    tabLayout.setupWithViewPager(viewPager);
}

ViewPager 适配器

public class GameListPagerAdapter extends FragmentStatePagerAdapter {

private final int PAGE_COUNT = 5;
private Context context;
private String pageTitle[] = {"Replaying", "Planning", "dropped", "playing","completed"};

public GameListPagerAdapter(FragmentManager fm, Context context) {
    super(fm);
    this.context = context;
}

@Override
public Fragment getItem(int position) {

    switch (position){

        case 0 :
            return GamesListPagerFragment.newInstance(GiantBomb.REPLAYING);
        case 1 :
            return GamesListPagerFragment.newInstance(GiantBomb.PLANNING);
        case 2 :
            return GamesListPagerFragment.newInstance(GiantBomb.DROPPED);
        case 3 :
            return GamesListPagerFragment.newInstance(GiantBomb.PLAYING);
        case 4:
            return GamesListPagerFragment.newInstance(GiantBomb.COMPLETED);

        default:
            return GamesListPagerFragment.newInstance(position);

    }

}

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


@Override
public CharSequence getPageTitle(int position) {
    return pageTitle[position];
}


}

包含textview和recyclerveiw的子 fragment

@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);
    Toaster.make(getContext(),"onActivity");
    recyclerView = (RecyclerView) getActivity().findViewById(R.id.recycler_view);
    recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
    realmResult =  realm.where(GameListDatabase.class).findAll();
    Toaster.make(getContext(),realmResult.size()+"");
    GameListAdapter adapter = new GameListAdapter(getContext(),realmResult,true);
    recyclerView.setAdapter(adapter);


}

最佳答案

首先,不要在适配器的 getItem(position) 方法中创建新项目。相反,创建一个 fragment List并将其填充到您的构造函数中,这样您就不会每次都创建新实例。

public class GameListPagerAdapter extends FragmentStatePagerAdapter {

    private Context context;
    private String pageTitle[] = {"Replaying", "Planning", "dropped", "playing", "completed"};
    private ArrayList<Fragment> fragments;

    public GameListPagerAdapter(FragmentManager fm, Context context) {
        super(fm);
        this.context = context;
        fragments = new ArrayList<>();
        fragments.add(GamesListPagerFragment.newInstance(GiantBomb.REPLAYING));
        fragments.add(GamesListPagerFragment.newInstance(GiantBomb.PLANNING));
        fragments.add(GamesListPagerFragment.newInstance(GiantBomb.DROPPED));
        fragments.add(GamesListPagerFragment.newInstance(GiantBomb.PLAYING));
        fragments.add(GamesListPagerFragment.newInstance(GiantBomb.COMPLETED));
    }

    @Override
    public Fragment getItem(int position) {
        return fragments.get(position);
    }

    @Override
    public int getCount() {
        return fragments.size();
    }

    @Override
    public CharSequence getPageTitle(int position) {
        return pageTitle[position];
    }
}

同时移动以下代码:

Toaster.make(getContext(),"onActivity");
    recyclerView = (RecyclerView) getActivity().findViewById(R.id.recycler_view);
    recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
    realmResult =  realm.where(GameListDatabase.class).findAll();
    Toaster.make(getContext(),realmResult.size()+"");
    GameListAdapter adapter = new GameListAdapter(getContext(),realmResult,true);
    recyclerView.setAdapter(adapter);  

从您的 onActivityCreated 到您的子 fragment 的 onCreateView 方法。
如果您没有很多子 fragment ,则可以将 viewPager.setOffscreenPageLimit 设置为您拥有的 fragment 数,在本例中为 5。

关于android - 嵌套 fragment 内的 Recyclerview 未显示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41504079/

相关文章:

android - 模拟器无法连接到 Google App Engine 开发服务器

AndroidViewClient 不显示 id

android - 如何在 android 中为注册用户和非注册用户显示不同的菜单项?

java - RecyclerView 能否与其余 fragment 布局一起滚动?

android - FragmentManager 添加相同 Fragment 类型的多个实例

android - 从 Expo XDE 在 Genymotion 中打开 Android 设备会出错

android - 如何从android获取完整的系统日志

android - 在文本更改监听器上添加破折号时无法从 EditText 字段中删除文本

android - 如何使用 xml 主题更改 appcompat 操作栏默认顶部和底部填充?

android - onActivityResult() 未调用