Android FragmentStatePagerAdapter - 缺少 View

标签 android fragmentstatepageradapter

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

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

这一切正常,直到我导航到另一个选项卡并且当我返回时中间 View 丢失,这发生在所有选项卡上。

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

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

我的适配器是代表 ViewPager 的 fragment 的内部类,看起来像:

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

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

以及此 fragment 的 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 随时加载两个 fragment 。

在你的情况下:

  • 位置 0 和 1

  • 位置 1 和 2。

意思是位置 1 的 fragment 总是“在那里”。

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

homeAddressViewPager.setOffscreenPageLimit(2);

这样,您的 fragment 将不会重新加载(默认情况下 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.

但是...最好在适配器不需要时保存您的 fragment 状态,并在它再次可见时重新加载它(例如通过使用 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;
    }
}

关于Android FragmentStatePagerAdapter - 缺少 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33017679/

相关文章:

android - FragmentStatePagerAdapter 处理 getItem() 位置

android-layout - 滚动时 View 寻呼机中的相机 SurfaceView 闪烁

java - FragmentStateAdapter 删除最后一个选项卡而不是当前的 ViewPager2

android - 实现 onSavedInstanceState 会停止 FragmentStatePagerAdapter 的工作

android - 应用程序未运行时的 BroadcastReceiver

javascript - 防止在移动设备回发时调整大小

android - 如何在 MaterialButton 中的文本右侧添加可绘制对象?

android - 如何仅检索一次 Firebase 数据库值而不监听子值,即使它们已更改

android - 更改列表项选择android上的背景颜色

android - 导航架构组件 - 未生成 DestinationFragmentArgs