Android FragmentStatePagerAdapter - 缺少视图

Android FragmentStatePagerAdapter - Missing view

我创建了一组水平选项卡,对于每个选项卡内容,它都有一个视图分页器,它又允许滑动视图的内容。

我目前正在将其编码为适配器中的 3 个视图,并返回一个新的内部片段,它表示每当调用 getItem() 时的细节。

在我导航到另一个选项卡之前这一切正常,当我返回时中间视图丢失,所有选项卡上都会出现这种情况。

当我查看调试时,我只看到对位置 0 和 2 的 getItem 调用,尽管总是缺少一个视图,所以我只是没有布局而不是渲染视图,如果我滑动我得到另一种观点。

如果我不单击另一个选项卡,而是继续在默认的第一个选项卡中的视图中滑动,那么我不会丢失视图,似乎只有当我单击转到另一个选项卡然后返回时才会丢失视图再次。我从来没有在位置 1 看到过查看请求,只有 0 或 2。

我的适配器是代表 ViewPager 的片段的内部 class,看起来像:

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>    

这是默认设置。 FragmentStatePagerAdapter 随时加载两个片段。

你的情况:

  • 位置 0 和 1

  • 位置 1 和 2。

表示位置 1 的片段总是 'there'。

您可以(因为您有 3 个片段)告诉您的 ViewPager,一次加载两个以上的片段

homeAddressViewPager.setOffscreenPageLimit(2);

这样,您的片段将不会重新加载(默认情况下 offScreenPageLimit 设置为 1)。

setOffscreenPageLimit(int number)

Set the number of pages that should be retained to either side of the current page in the view hierarchy in an idle state.

但是...最好在适配器不需要时保存您的片段状态,并在它再次可见时重新加载它(例如通过使用 onSaveInstanceState

更新:

如前所述,您的工作流程应该是这样的。您发送请求以获取所有地址,在 ArrayList 中解析它们,每个 Fragment 应该表示您的 ArrayList 中的一个条目。

最好的方法是将解析后的 ArrayList 传递给适配器,并在调用 getItem() 时将 ArrayList 条目传递给包(这样您就可以在 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;
    }
}