首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Android FragmentStatePagerAdapter -缺少视图

Android FragmentStatePagerAdapter -缺少视图
EN

Stack Overflow用户
提问于 2015-10-08 13:46:30
回答 1查看 858关注 0票数 1

我已经创建了一组水平选项卡,对于每个选项卡内容,它都有一个视图寻呼机,它反过来允许视图的内容被滑动。

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

这个操作很好,直到我导航到另一个选项卡,当我返回中间视图时,所有选项卡上都会出现这种情况。

当我查看调试时,我只看到了对位置0和2的getItem调用,但是始终缺少一个视图,因此,与呈现的视图不同,我只是没有在那里进行布局,如果我滑动,就会得到另一个视图。

如果我没有点击另一个选项卡,而只是继续浏览选项卡中的视图,这是默认的,那么我不会失去一个视图,似乎只有当我点击去另一个选项卡,然后再回来。不过,我从来没有在第1位置看到过视图请求,只有0或2。

我的适配器是片段的内部类,它表示ViewPager,如下所示:

代码语言:javascript
复制
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:

代码语言:javascript
复制
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:

代码语言:javascript
复制
<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>    
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-10-08 13:57:35

这是默认的。FragmentStatePagerAdapter随时保存两个加载的片段。

就你而言:

  • 位置0和1

  • 位置1和2。

意思是在位置1的片段总是‘在那里’。

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

代码语言:javascript
复制
homeAddressViewPager.setOffscreenPageLimit(2);

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

setOffscreenPageLimit(int number) 将应保留的页数设置为视图层次结构中处于空闲状态的当前页的任何一方。

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

更新:

正如讨论的那样,你的工作流程会是这样的。您发送一个请求来获取所有地址,并在ArrayList中解析它们,每个片段应该是来自您的ArrayList的一个条目的表示。

最好的方法是将解析的ArrayList传递给适配器,在调用getItem()时,将ArrayList条目传递给包(这样就可以在片段中访问它)。

代码语言:javascript
复制
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;
    }
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33017679

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档