Android FragmentStatePagerAdapter - 缺少视图

时间:2015-10-08 13:46:31

标签: android fragmentstatepageradapter

我创建了一组水平标签,每个标签内容都有一个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>    

1 个答案:

答案 0 :(得分:2)

这是默认情况。 FragmentStatePagerAdapter 会随时加载两个片段。

在你的情况下:

  • 位置0和1

  • 位置1和2。

位置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;
    }
}