安卓 ViewPager + Fragment 多次切换页面后页面空白

安卓 ViewPager + Fragment 多次切换页面后页面空白

项目场景:

在写项目联系时总是出现ViewPager滑动空白,此前也通过度娘解决了很多次。这次系统性的写一下解决方式


问题描述

写完XML和Adapter,当你运行软件觉得一切顺利,但是在划拉两下之后就觉得不对劲…??这怎么,空白了!


原因分析:

动态加载Fragment,页面显示空白,就是onCreateView()方法每次都调用导致的,这样fragment每次都会设置新的View,并且之前的View并没有被回收,这就导致了新的View覆盖了旧的View,旧View不显示。


解决方案:

  • 通过设置预加载页面数量解决,适用于页面复杂且数据量不大的方案
  • 通过重写适配器的Destory方法限制Fragment的销毁
  • 在父View当中移除旧View并重新加载View

第一种,也是最简单的一种:
通过设置预加载页面数量解决,适用于页面不复杂且数据量不大的方案

viewPager.offscreenPageLimit = fragment.size

第二种
通过重写适配器的destroyItem方法,不调用超类的destroyItem方法从而限制Fragment的销毁。适用于页面不复杂且数据量不大的方案

viewPager.adapter = object :FragmentPagerAdapter(supportFragmentManager){
                override fun getCount() = size

                override fun getItem(position: Int): Fragment = get(position)

                override fun destroyItem(container: ViewGroup, position: Int, `object`: Any) {
                    //super.destroyItem(container, position, `object`)
                }
            }

第三种
在onCreateView()中判断Fragment中是否已经添加了contentView,第一次加载时,可以将view保存下来,之后再加载时判断保存的view是否为空,如果为空,则return新加载的view,如果不为空,先将保存的view从父view中移除,然后再return该view。

    protected var rootView: View? = null

    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        if (rootView != null){
            rootView?.parent.apply{
                this as ViewGroup
                removeView(rootView)
            }
            return rootView
        }
        return LayoutInflater.from(context).inflate(getLayoutId(),null,false).also{
            rootView = it
        }
    }

初学kotlin,如有勘误多多包涵

  • 5
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
A ViewPager is a layout manager that allows the user to swipe left and right to move between pages of data. In the case of a Fragment-based ViewPager, each page is represented by a Fragment. To use a ViewPager with Fragments, you need to do the following: 1. Create a layout file that contains a ViewPager element. 2. Create a Fragment class that will represent a single page in the ViewPager. This class should inflate a layout that contains any UI elements you want to display on the page. 3. Create an adapter class that extends FragmentPagerAdapter or FragmentStatePagerAdapter. This adapter will be responsible for creating and managing the Fragments that are displayed in the ViewPager. 4. Set the adapter on the ViewPager. Here's an example of how to create a Fragment-based ViewPager: 1. Create a layout file that contains a ViewPager element. For example: ``` <android.support.v4.view.ViewPager android:id="@+id/view_pager" android:layout_width="match_parent" android:layout_height="match_parent" /> ``` 2. Create a Fragment class that will represent a single page in the ViewPager. For example: ``` public class MyFragment extends Fragment { @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment_my, container, false); // TODO: Set up UI elements in the layout return view; } } ``` 3. Create an adapter class that extends FragmentPagerAdapter or FragmentStatePagerAdapter. For example: ``` public class MyPagerAdapter extends FragmentPagerAdapter { public MyPagerAdapter(FragmentManager fm) { super(fm); } @Override public Fragment getItem(int position) { // TODO: Return a new instance of MyFragment for the given position return null; } @Override public int getCount() { // TODO: Return the total number of pages return 0; } } ``` 4. Set the adapter on the ViewPager in your Activity or Fragment. For example: ``` ViewPager viewPager = findViewById(R.id.view_pager); MyPagerAdapter adapter = new MyPagerAdapter(getSupportFragmentManager()); viewPager.setAdapter(adapter); ``` That's it! You should now have a functioning Fragment-based ViewPager. Of course, you'll need to fill in the TODOs in the code snippets above to actually display content on the pages.

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值