TabLayout 第二次显示空白片段
TabLayout shows a blank fragment, the second time
在我的 Android 应用程序中,我使用 TabLayout
和 FragmentStatePagerAdapter
来显示动态生成的片段。
它第一次正确显示了片段,但是当返回到一些已经查看过的而不是相邻的片段时,它显示了一个空白页面...
我已经调查过了,似乎有两种方法可以解决这个问题:
使用 FragmentStatePagerAdapter
而不是 FragmentPagerAdapter
,我已经这样做了,它没有改变任何东西。
改变
adapter = new FragmentStatePagerAdapter(*getSupportFragmentManager*());
进入:
adapter = new FragmentStatePagerAdapter(*getChildFragmentManager*());
我做不到,因为我在 AppCompatActivity
中并且此方法在片段中...
有没有办法解决这个问题,而不用将 activity 扩展到 FragmentActivity
之外,这会搞砸我项目中的其他东西?
代码:
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;
}
}
实施:
subsPager = (ViewPager) findViewById(R.id.subsPager);
tabLayout = (TabLayout) findViewById(R.id.tabs_view);
subsPager.setAdapter(adapter);
tabLayout.setupWithViewPager(subsPager)
编辑 - 片段代码:
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();
}
}
}
它比看起来更愚蠢,删除了这一行:
if (posts.size() == 0) {
来自 Fragment 中的 loadItems,使其按预期工作。
感谢cricket_007的指点!
在我的 Android 应用程序中,我使用 TabLayout
和 FragmentStatePagerAdapter
来显示动态生成的片段。
它第一次正确显示了片段,但是当返回到一些已经查看过的而不是相邻的片段时,它显示了一个空白页面...
我已经调查过了,似乎有两种方法可以解决这个问题:
使用
FragmentStatePagerAdapter
而不是FragmentPagerAdapter
,我已经这样做了,它没有改变任何东西。改变
adapter = new FragmentStatePagerAdapter(*getSupportFragmentManager*());
进入:
adapter = new FragmentStatePagerAdapter(*getChildFragmentManager*());
我做不到,因为我在AppCompatActivity
中并且此方法在片段中...
有没有办法解决这个问题,而不用将 activity 扩展到 FragmentActivity
之外,这会搞砸我项目中的其他东西?
代码:
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;
}
}
实施:
subsPager = (ViewPager) findViewById(R.id.subsPager);
tabLayout = (TabLayout) findViewById(R.id.tabs_view);
subsPager.setAdapter(adapter);
tabLayout.setupWithViewPager(subsPager)
编辑 - 片段代码:
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();
}
}
}
它比看起来更愚蠢,删除了这一行:
if (posts.size() == 0) {
来自 Fragment 中的 loadItems,使其按预期工作。 感谢cricket_007的指点!