我已经创建了一组水平选项卡,对于每个选项卡内容,它都有一个视图寻呼机,它反过来允许视图的内容被滑动。
我目前正在将其重新编码为适配器中的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> 发布于 2015-10-08 13:57:35
这是默认的。FragmentStatePagerAdapter随时保存两个加载的片段。
就你而言:
或
意思是在位置1的片段总是‘在那里’。
您可以(因为您有3个片段),告诉您的ViewPager,一次加载两个以上的片段
homeAddressViewPager.setOffscreenPageLimit(2);这样,就不会重新加载片段(默认情况下,offScreenPageLimit设置为1)。
setOffscreenPageLimit(int number)将应保留的页数设置为视图层次结构中处于空闲状态的当前页的任何一方。
但是..。最好在适配器不需要时保存碎片状态,并在适配器再次可见时重新加载它(例如使用onSaveInstanceState)。
更新:
正如讨论的那样,你的工作流程会是这样的。您发送一个请求来获取所有地址,并在ArrayList中解析它们,每个片段应该是来自您的ArrayList的一个条目的表示。
最好的方法是将解析的ArrayList传递给适配器,在调用getItem()时,将ArrayList条目传递给包(这样就可以在片段中访问它)。
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;
}
}https://stackoverflow.com/questions/33017679
复制相似问题