[英]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应用程序中,我使用带有FragmentStatePagerAdapter
的TabLayout
来显示动态生成的片段。 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.