最新在開發(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)注~