我创建了一组水平标签,每个标签内容都有一个View分页器,它可以刷新视图的内容。
我目前正在将这个视图转换为适配器中的3个视图,并返回一个新的内部片段,该片段在调用getItem()时表示详细信息。
这样可以正常工作,直到我导航到另一个选项卡,当我返回时,中间视图丢失,这会发生在所有选项卡上。
当我看到调试时,我只看到对位置0和2的getItem调用,但总是有一个视图丢失,所以而不是渲染视图我只是没有布局,如果我滑动我得到另一个图。
如果我没有点击另一个标签,只是继续浏览第一个标签中的视图,这是默认值,那么我不会丢失一个视图,它似乎只是在我点击进入另一个标签然后再返回时。我从未在第1位看到过查看请求,只有0或2。
我的适配器是片段的内部类,代表ViewPager,如下所示:
public class HomeAddressDetailFragmentStatePageAdapter extends FragmentStatePagerAdapter {
public HomeAddressDetailFragmentStatePageAdapter(FragmentManager fragmentManager) {
super(fragmentManager);
}
@Override
public int getCount() {
return 3;
}
@Override
public android.support.v4.app.Fragment getItem(int position) {
Log.d(LOG_TAG, "requesting tab view in position: " + position);
android.support.v4.app.Fragment fragment = null;
fragment = new HomeAddressDetailFragment();
return fragment;
}
}
片段的onCreate:
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View rootView = (View)inflater.inflate(R.layout.fragment_home_addresses, container, false);
HomeAddressDetailFragmentStatePageAdapter homeAddressDetailFragmentStatePageAdapter = new HomeAddressDetailFragmentStatePageAdapter(getFragmentManager());
homeAddressViewPager = (ViewPager)rootView.findViewById(R.id.home_addr_pager);
homeAddressViewPager.setAdapter(homeAddressDetailFragmentStatePageAdapter);
return rootView;
}
此片段的xml:
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.v4.view.ViewPager xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/home_addr_pager"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1">
</android.support.v4.view.ViewPager>
</FrameLayout>
答案 0 :(得分:2)
这是默认情况。 FragmentStatePagerAdapter 会随时加载两个片段。
在你的情况下:
或
位置1处的含义片段始终为“那里”。
你可以(因为你有3个片段),告诉你的ViewPager
,一次加载两个以上的片段
homeAddressViewPager.setOffscreenPageLimit(2);
这样,您的片段将不会被重新加载(默认情况下,offScreenPageLimit设置为1)。
setOffscreenPageLimit(int number)
设置在空闲状态下视图层次结构中应保留到当前页面任一侧的页数。
但是......最好在适配器不需要时保存片段状态,并在它再次可见时重新加载(例如使用onSaveInstanceState
)
更新:
如上所述,您的工作流程将是这样的。您发送获取所有地址的请求,在ArrayList中解析它们,每个Fragment应该是ArrayList中一个条目的表示。
最好的方法是将解析后的ArrayList传递给适配器,并在调用getItem()
时,将ArrayList条目传递给bundle(这样你就可以在Fragment中访问它了。)
public class HomeAddressDetailFragmentStatePageAdapter extends FragmentStatePagerAdapter {
private ArrayList<Address> arrayListAddress;
public HomeAddressDetailFragmentStatePageAdapter(FragmentManager fragmentManager, ArrayList<Address> arrayList) {
super(fragmentManager);
arrayListAddress = arrayList;
}
@Override
public int getCount() {
return arrayListAddress.size();
}
@Override
public android.support.v4.app.Fragment getItem(int position) {
Bundle bundle = new Bundle();
bundle.putSerializable("address", arrayListAddress.get(position));
android.support.v4.app.Fragment fragment = new HomeAddressDetailFragment();
fragment.setArguments(bundle);
return fragment;
}
}