Android Tablayout/Viewpager中的空白片段
所以我在拼命寻找我问题的答案。我花了几个小时尝试和重试一些事情,但没有工作。 这就是我的问题: 我的应用程序只有一个活动,即主要活动。 此活动包含一个底部导航栏和一个框架布局,用于根据底部导航栏上项目的选择加载片段 我的PredictionsFragment(由底部导航栏加载)包含一个表格布局(使用库)。在这个片段中,数据列表被加载到线程中,因为它使用internet连接。TableLayout包含PredictionsViewFragment,它显示一个RecyclerView。 当我在底部导航栏上选择PredictionsFragment时,TableLayout和所有recyclerview都会完美地显示出来。 但当我转到另一个项目并返回PredictionsFragment时,它会显示一个空白视图 PredictionsFragment代码:Android Tablayout/Viewpager中的空白片段,android,android-fragments,android-recyclerview,android-adapter,android-tablayout,Android,Android Fragments,Android Recyclerview,Android Adapter,Android Tablayout,所以我在拼命寻找我问题的答案。我花了几个小时尝试和重试一些事情,但没有工作。 这就是我的问题: 我的应用程序只有一个活动,即主要活动。 此活动包含一个底部导航栏和一个框架布局,用于根据底部导航栏上项目的选择加载片段 我的PredictionsFragment(由底部导航栏加载)包含一个表格布局(使用库)。在这个片段中,数据列表被加载到线程中,因为它使用internet连接。TableLayout包含PredictionsViewFragment,它显示一个RecyclerView。 当我在底部导
public class PredictionsFragment extends Fragment {
private static List<Country> countryList = new ArrayList<>();
private ViewPager viewPager;
private SmartTabLayout viewPagerTab;
private FragmentStatePagerItemAdapter adapter;
private FragmentPagerItems pages;
private ProgressBar progressBar;
private ViewGroup tab;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View view = inflater.inflate(R.layout.fragment_predictions_tab, container, false);
initView(view);
return view;
}
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
if (countryList.size() == 0) {
refresh();
} else {
refreshViewPager();
}
}
private void initView(View view) {
tab = (ViewGroup) view.findViewById(R.id.tab);
tab.addView(LayoutInflater.from(getContext()).inflate(R.layout.fragment_view_predictions, tab, false));
progressBar = (ProgressBar) view.findViewById(R.id.progressbar);
viewPager = (ViewPager) view.findViewById(R.id.viewpager);
viewPagerTab = (SmartTabLayout) view.findViewById(R.id.viewpagertab);
viewPager.setOffscreenPageLimit(countryList.size());
pages = new FragmentPagerItems(getContext());
adapter = new FragmentStatePagerItemAdapter(getFragmentManager(), pages){
public int getItemPosition(Object object) {
return POSITION_NONE;
}
};
viewPager.setAdapter(adapter);
viewPagerTab.setViewPager(viewPager);
}
private void refresh() {
// Thread car connexion internet
new Thread(new Runnable() {
@Override
public void run() {
countryList = InternetData.getCountryList();
refreshViewPager();
}
}).start();
}
private void refreshViewPager() {
getActivity().runOnUiThread(new Runnable() {
@Override
public void run() {
for (Country country : countryList) {
pages.add(FragmentPagerItem.of(country.getCode(), PredictionsViewFragment.class));
}
adapter.notifyDataSetChanged();
viewPagerTab.setViewPager(viewPager);
progressBar.setVisibility(View.GONE);
}
});
}
public static List<Prediction> getPredictionList(int index) {
return countryList.get(index).getPredictionList();
}
}
public class PredictionsViewFragment extends Fragment {
private RecyclerView recyclerView;
private PredictionAdapter adapter;
private int position;
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container,
@Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.recycler_view_pronos, container, false);
position = FragmentPagerItem.getPosition(getArguments());
initRecyclerView(view);
return view;
}
@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
}
private void initRecyclerView(View view) {
recyclerView = (RecyclerView) view.findViewById(R.id.recycler_view);
recyclerView.setHasFixedSize(true);
adapter = new PredictionAdapter(PredictionsFragment.getPredictionList(position));
recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
recyclerView.setAdapter(adapter);
}
}
编辑:
使用getChildFragmentManager()方法时:
我在第二次处理片段时遇到了这个错误(第一次处理时,它工作得非常好):
编辑2:
我在PredictionsFragment上的onViewCreated方法中添加了以下行:
else {
refreshViewPager();
}
但它完全没有任何作用。。。选项卡的名称会正确显示,但不会显示recyclerview。。。
就好像tablayout中的片段没有加载
编辑3:
我已将SwipeRefreshLayout添加到我的recyclerview中,对于前两个选项卡,我无法进行拉式刷新,从第三个选项卡中,仅显示一项recyclerview,拉式刷新“有效”,但在recyclerview中仅显示一项
如果你有任何问题,告诉我,我会尽力回答!
提前感谢您的帮助,我非常感谢您在viewPager中使用
setOffsetScreenPageLimit
:这将帮助您在浏览底部选项卡时将数据存储在寻呼机片段中
viewPager.setOffscreenPageLimit(the number of tab you are setting);
所以我解决了我的问题 您必须使用以下选项:
adapter = new FragmentPagerItemAdapter(getChildFragmentManager(), pages);
使用FragmentPagerItemAdapter和不使用FragmentStatePagerItemAdapter
对于sur,您必须使用getChildFragmentManager()我也使用BottomNavigationView打开带有viewPager的tabLayout&面临同样的问题。FragmentStatePagerAdapter可用于此
这个类处理片段状态的保存和恢复->请分享你的代码好吗?学习
setUserVisibleHint()
methodshow some code??我用一些代码编辑了我的帖子!我添加了一个空白片段的截图和附加的我的代码的设计,并添加了StutOffFIX筛选器,但它没有改变任何东西。我的第一个和第二个片段在我的表格布局中是空白的……你也可以更新VIEpPar适配器代码吗?我在我的应用程序中使用BottomNavigationView,在片段中我使用ViewPager作为选项卡。我还在RecyclerView中加载选项卡片段中的数据,它工作正常。我没有查看寻呼机适配器的代码,我使用上面引用的库。这是一个名为FragmentStatePagerItemAdapter的类
viewPager.setOffscreenPageLimit(the number of tab you are setting);
adapter = new FragmentPagerItemAdapter(getChildFragmentManager(), pages);