![](/img/trans.png)
[英]Using FragmentStatePageAdapter to retain position for fragment with ViewPager
[英]FragmentStatePageAdapter ViewPager 5 Tabs Using single Fragment
我正在使用ViewPager Tablayout显示5个选项卡,当选择这些选项卡时会从服务器获取数据以显示。 所获取的数据的唯一区别是选定的选项卡。 因此,如果有5个片段做同样的事情,那将是多余的。 因此,我实现了如下利用一个片段。
活动
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_news_feed);
mSectionsPageAdapter = new SectionsPageAdapter(getSupportFragmentManager());
final ViewPager viewPager = (ViewPager)findViewById(R.id.pager);
setupViewPager(viewPager);
TabLayout tabLayout = (TabLayout)findViewById(R.id.tabLayout);
tabLayout.setupWithViewPager(viewPager);
tabLayout.getTabAt(0).setIcon(R.drawable.blogging);
tabLayout.getTabAt(1).setIcon(R.drawable.tanzania);
tabLayout.getTabAt(2).setIcon(R.drawable.world);
tabLayout.getTabAt(3).setIcon(R.drawable.football);
tabLayout.getTabAt(4).setIcon(R.drawable.coins);
}
private void setupViewPager(ViewPager viewPager){
Bundle bundle = new Bundle();
bundle.putString("edttext", "0");
NewsFeedTab1 fragObj1 = new NewsFeedTab1();
fragObj1.setArguments(bundle);
Bundle bundle2 = new Bundle();
bundle2.putString("edttext", "8,15");
NewsFeedTab1 fragObj2 = new NewsFeedTab1();
fragObj2.setArguments(bundle2);
Bundle bundle3 = new Bundle();
bundle3.putString("edttext", "9,10,13");
NewsFeedTab1 fragObj3 = new NewsFeedTab1();
fragObj3.setArguments(bundle3);
Bundle bundle4 = new Bundle();
bundle4.putString("edttext", "11");
NewsFeedTab1 fragObj4 = new NewsFeedTab1();
fragObj4.setArguments(bundle4);
Bundle bundle5 = new Bundle();
bundle5.putString("edttext", "12");
NewsFeedTab1 fragObj5 = new NewsFeedTab1();
fragObj5.setArguments(bundle5);
SectionsPageAdapter adapter = new SectionsPageAdapter(getSupportFragmentManager());
adapter.addFragment(fragObj1, "Habari");
adapter.addFragment(fragObj2, "Kitaifa");
adapter.addFragment(fragObj3, "Kimataifa");
adapter.addFragment(fragObj4, "Michezo");
adapter.addFragment(fragObj5, "Biashara");
viewPager.setAdapter(adapter);
}
问题是,启动Pagedapter时,它将初始化选项卡的位置0和1(根据研究是正常的),这将意味着将用于选项卡2的数据带入选项卡1中。我尝试实现setUserVisibleHint,但我认为没有区别。 我猜setUserVisibleHint是每个选项卡具有多个片段时的合适解决方案。
分段
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
if (getView() != null) {
isViewShown = true;
// fetchdata() contains logic to show data when page is selected mostly asynctask to fill the data
} else {
isViewShown = false;
}
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view= inflater.inflate(R.layout.fragment_news_feed_tab1, container, false);
fragView = view;
currTab = getArguments().getString("edttext");
if (!isViewShown) {
loadNewsFeed(isBottom = "0", isTop = "0", lastStart = "0", lastStop = "0");
}
}
我如何消除我猜双击以启动Fragment所导致的单击Tab上的混淆问题。
对于那些可能有类似问题的人。 我在https://stackoverflow.com/a/20412875/2448688找到了解决方案。 基本上,不是在OnCreateView中调用凌空,而是在fragmentBecameVisible方法中调用该方法,该方法在接口中实现以通知片段是否可见,并且此时仅调用Volley。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.