简体   繁体   English

TabLayout第二次显示空白片段

[英]TabLayout shows a blank fragment, the second time

In my Android application I'm using a TabLayout with a FragmentStatePagerAdapter to show dynamically generated fragments. 在我的Android应用程序中,我使用带有FragmentStatePagerAdapterTabLayout来显示动态生成的片段。 It shows correctly the fragments the first time, but when going back to some that are already viewed and are not the adjacent ones it shows a blank page... 第一次可以正确显示片段,但是当返回到已经查看但不是相邻的片段时,它将显示空白页面。

I've looked into this and there seems to be two way of fixing this: 我研究了这个问题,似乎有两种方法可以解决此问题:

  • Using FragmentStatePagerAdapter instead of FragmentPagerAdapter , which I already did and it didn't change anything. 使用FragmentStatePagerAdapter而不是FragmentPagerAdapter ,我已经做到了,并且没有任何改变。

  • Change 更改
    adapter = new FragmentStatePagerAdapter(*getSupportFragmentManager*());
    into: 成:
    adapter = new FragmentStatePagerAdapter(*getChildFragmentManager*());
    that I can't do because I'm in AppCompatActivity and this method is in Fragment... 因为我在AppCompatActivity并且此方法在Fragment中所以无法执行...

Is there a way to solve this issue without extending this activity out of FragmentActivity that would screw up other stuff in my project? 有没有一种方法可以解决此问题,而无需将此活动扩展到FragmentActivity ,而这会使我项目中的其他内容搞砸了?

Code: 码:

private class SubsPagerAdapter extends FragmentStatePagerAdapter {

    private final ArrayList<Fragment> fragmentsList = new ArrayList<>();
    private final ArrayList<String> titleList = new ArrayList<>();

    SubsPagerAdapter(FragmentManager manager) {
        super(manager);
    }

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

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

    void addFragment(Fragment fragment, String title) {
        fragmentsList.add(fragment);
        titleList.add(title);
    }

    @Override
    public CharSequence getPageTitle(int position) {
        return titleList.get(position);
    }

    @Override
    public Parcelable saveState() {
        return null;
    }
}

Implementation: 执行:

subsPager = (ViewPager) findViewById(R.id.subsPager);
                        tabLayout = (TabLayout) findViewById(R.id.tabs_view);

subsPager.setAdapter(adapter);
tabLayout.setupWithViewPager(subsPager)

Edit - Fragment Code: 编辑-片段代码:

public class PostsListFragment extends Fragment {

private ArrayList<CustomPost> posts;

private Sorting sorting;

private String name;
private RecyclerView recyclerView;
private SubPostsAdapter adapter;
private LinearLayoutManager linearLayoutManager;
private Fetcher fetcher

public PostsListFragment() {
    this.posts = new ArrayList<>();
}

public static Fragment newInstance(String name) {
    PostsListFragment pf = new PostsListFragment();
    pf.name = name;

    return pf;
}

@Override
public View onCreateView (LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    recyclerView = (RecyclerView) inflater.inflate(R.layout.posts_list_holder, container, false);

    //default sorting
    this.sorting = Sorting.HOT;
    this.fetcher = new Fetcher(name);

    loadItems();

    return recyclerView;
}

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setRetainInstance(true);
    setHasOptionsMenu(true);
}

private void loadItems() {
    if (posts.size() == 0) {
        new Thread() {
            @Override
            public void run() {
                posts.addAll(fetcher.fetchPosts(sorting));

                new Thread() {
                    @Override
                    public void run() {
                        linearLayoutManager = new LinearLayoutManager(recyclerView.getContext());

                        adapter = new SubPostsAdapter(posts, getActivity());

                        getActivity().runOnUiThread(new Runnable() {
                            @Override
                            public void run() {
                                recyclerView.setLayoutManager(linearLayoutManager);
                                recyclerView.setAdapter(adapter);
                            }
                        });

                    }
                }.start();
            }
        }.start();
    }
}
}

It was more stupid then it looked, removing this line: 然后看起来更愚蠢,删除了这一行:

 if (posts.size() == 0) {

from loadItems in the Fragment, makes it work as intended. 来自Fragment中的loadItems,使其按预期工作。 Thanks to cricket_007 for the advices! 感谢cricket_007的建议!

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM