Android Fragment懶加載解決方式~(ViewPager+BottomNavigationView)

最新在開發(fā)新項目,框架搭建過程中。遇到fragment懶加載問題,項目中使用了ViewPager+BottomNavigationView的Ui來完成。接下來我來介紹下我是如何解決Fragment懶加載的。

正文:

首先來看xml文件

   <androidx.viewpager.widget.ViewPager
        android:layout_below="@id/view_mian"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

    <com.google.android.material.bottomnavigation.BottomNavigationView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginStart="0dp"
        android:layout_marginEnd="0dp"
        app:labelVisibilityMode="labeled"
        app:itemTextColor="@color/bottom_nav_color"
        app:itemIconTint="@color/bottom_nav_color"
        android:layout_alignParentBottom="true"
        app:menu="@menu/bottom_nav_menu" />

接下來初始化數(shù)據(jù)

    var mFragmentList: ArrayList<Fragment> = ArrayList()
    var mtitleList: ArrayList<String> = ArrayList()

   //初始化數(shù)據(jù)
        val bookClassifyFragment: BookClassifyFragment = BookClassifyFragment()
        val bookCityFragment: BookCityFragment = BookCityFragment()
        val bookrackFragment: BookRackFragment = BookRackFragment()
        val myFragment: MyFragment = MyFragment()
        mFragmentList.add(bookClassifyFragment)
        mFragmentList.add(bookCityFragment)
        mFragmentList.add(bookrackFragment)
        mFragmentList.add(myFragment)
        mtitleList.add(resources.getString(R.string.bookrack))
        mtitleList.add(resources.getString(R.string.book_city))
        mtitleList.add(resources.getString(R.string.book_classify))
        mtitleList.add(resources.getString(R.string.user))

創(chuàng)建ViewPager需要的Adapter

public class BookCityFragmentStatePagerAdapter extends PagerAdapter {

    private List<Fragment> fragmentList;
    private List<String> titleList;
    private FragmentManager manager;

    public BookCityFragmentStatePagerAdapter(List<Fragment> fragmentList, List<String> titleList, FragmentManager fm) {
        super();
        this.fragmentList = fragmentList;
        this.titleList = titleList;
        this.manager = fm;
    }

    @Override
    public Object instantiateItem(ViewGroup container, int position) {
        Fragment fragment = fragmentList.get(position);
        //判斷當(dāng)前的fragment是否已經(jīng)被添加進(jìn)入Fragmentanager管理器中
        if (!fragment.isAdded()) {
            FragmentTransaction transaction = manager.beginTransaction();
            transaction.add(fragment, fragment.getClass().getSimpleName());
            //不保存系統(tǒng)參數(shù),自己控制加載的參數(shù)
            transaction.commitAllowingStateLoss();
            //手動調(diào)用,立刻加載Fragment片段
            manager.executePendingTransactions();
        }
        if (fragment.getView().getParent() == null) {
            //添加布局
            container.addView(fragment.getView());
        }
        return fragment.getView();
    }


    @Override
    public int getCount() {
        return titleList.size();
    }

    @Override
    public void destroyItem(ViewGroup container, int position, Object object) {
        //移除布局
        container.removeView(fragmentList.get(position).getView());
    }

    @Override
    public boolean isViewFromObject(@NonNull View view, @NonNull Object object) {
        return view == object;
    }

    @Nullable
    @Override
    public CharSequence getPageTitle(int position) {
        return titleList.get(position);
    }
}

這里是最重要的地方

  if (!fragment.isAdded()) {
            FragmentTransaction transaction = manager.beginTransaction();
            transaction.add(fragment, fragment.getClass().getSimpleName());
            //不保存系統(tǒng)參數(shù),自己控制加載的參數(shù)
            transaction.commitAllowingStateLoss();
            //手動調(diào)用,立刻加載Fragment片段
            manager.executePendingTransactions();
        }
        if (fragment.getView().getParent() == null) {
            //添加布局
            container.addView(fragment.getView());
        }

接下來綁定數(shù)據(jù),將剛創(chuàng)建的adpter的綁定到ViewPager上。
通過ViewPager.addOnPageChangeListener為每次點擊的時候來設(shè)置BottomNavigationView選中狀態(tài)。
通過BottomNavigationView.setOnNavigationItemSelectedListener方法來選擇每次點擊的menu時ViewPager的頁面顯示位置。

 val bookcitAdapter = BookCityFragmentStatePagerAdapter(
            mFragmentList,
            mtitleList,
            getSupportFragmentManager()
        )
        viewBinding.vpMian.adapter = bookcitAdapter
        //ViewPager綁定視圖
        viewBinding.vpMian.addOnPageChangeListener(object : ViewPager.OnPageChangeListener {
            override fun onPageScrolled(
                position: Int,
                positionOffset: Float,
                positionOffsetPixels: Int
            ) {

            }

            override fun onPageSelected(position: Int) {
                viewBinding.bottomnavMain.menu.getItem(position).isChecked = true
            }

            override fun onPageScrollStateChanged(state: Int) {

            }
        })
        //禁止ViewPager滑動
        viewBinding.vpMian.setOnTouchListener(object : View.OnTouchListener {
            override fun onTouch(v: View?, event: MotionEvent?): Boolean {
                return true
            }
        })


        viewBinding.bottomnavMain.setOnNavigationItemSelectedListener { menuItem ->
            when (menuItem.itemId) {
                R.id.navigation_bookrack -> {

                    viewBinding.vpMian.currentItem = 0
                }

                R.id.navigation_book_city -> {
                    viewBinding.vpMian.currentItem = 1
                }
                R.id.navigation_book_classify -> {
                    viewBinding.vpMian.currentItem = 2
                }
                R.id.navigation_my -> {
                    viewBinding.vpMian.currentItem = 3
                }
            }
            true
        }

至此結(jié)束,各位喜歡的話可以點點關(guān)注~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容