TabLayout+ViewPager+FragmentPagerAdapter 實現懶加載(配合RecycleVIew+SmartRefreshLayout庫的使用)
先上效果圖:
簡單說明:做個簡單的記錄,代碼會使用一些簡單概述,詳細代碼後面再完善
1.庫的使用及引用情況
使用到的庫:
implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.0.4'
implementation 'com.yanzhenjie:recyclerview-swipe:1.0.3'
implementation 'com.android.support:recyclerview-v7:29.0.0-rc02'
2.宿主Fragment中的佈局代碼
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<!-- TODO: Update blank fragment layout -->
<com.google.android.material.tabs.TabLayout
android:id="@+id/tablayout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:tabIndicatorFullWidth="false"
app:tabIndicatorColor="#FFFDDC4E"
app:tabSelectedTextColor="@color/color_FF222222"
app:tabTextAppearance="@style/TabLayoutTextStyle" />
<androidx.viewpager.widget.ViewPager
android:id="@+id/viewPager"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:background="@color/white"/>
</LinearLayout>
說明:android工程引用的是androidx的包
3.宿主Fragment的使用
public class HomeFragment extends Fragment{
private MyFragmentPagerAdapter adapter;
.....
public void initView(View rootView) {
ViewPager viewPager = rootView.findViewById(R.id.viewPager);
adapter = new MyFragmentPagerAdapter(getChildFragmentManager(), getContext());
viewPager.setAdapter(adapter);
//這個地方:setOffscreenPageLimit傳0和1的效果是一樣的,(預加載的效果)
viewPager.setOffscreenPageLimit(0);
//TabLayout
TabLayout tabLayout = rootView.findViewById(R.id.tablayout);
tabLayout.setTabGravity(TabLayout.GRAVITY_FILL);
tabLayout.setTabMode(TabLayout.MODE_SCROLLABLE);
//顯示當前那個標籤頁
viewPager.setCurrentItem(0);
tabLayout.setupWithViewPager(viewPager);
}
.....
}
4.創建FragmentPagerAdapter適配器
public class MyFragmentPagerAdapter extends FragmentPagerAdapter {
private String[] titles = new String[]{"0","1","2","3","4","5","6"};
public int COUNT = titles.length;
private Context context;
public MyFragmentPagerAdapter(FragmentManager fm, Context context) {
super(fm);
this.context = context;
}
@Override
public Fragment getItem(int position) {
switch (position){
case 0:
return PageFragment.newInstance("0");
case 1:
return PageFragment.newInstance("1");
case 2:
return PageFragment.newInstance("2");
case 3:
return PageFragment.newInstance("3");
case 4:
return PageFragment.newInstance("4");
case 5:
return PageFragment.newInstance("5");
case 6:
return PageFragment.newInstance("6");
}
return null;
}
@Override
public int getCount() {
return COUNT;
}
@Override
public CharSequence getPageTitle(int position) {
return titles[position];
}
//一定要使用這個,記得註釋掉super的方法
@Override
public void destroyItem(@NonNull ViewGroup container, int position, @NonNull Object object) {
// super.destroyItem(container, position, object);
}
}
5.構建最終顯示數據的Fragment
public class PageFragment extends Fragment{
private SmartRefreshLayout mSmartRefreshLayout;
private RecyclerView mRecyclerView;
public static PageFragment newInstance(String title) {
PageFragment fragment = new PageFragment();
Bundle ban = new Bundle();
ban.putString("key", title);
fragment.setArguments(ban);
return fragment;
}
@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
title = getArguments().getString("key");
initView(view);
initAdatper();
//通過getUserVisibleHit()方法判斷當前頁面是否可見,來加載不同key頁面要求的數據
if (getUserVisibleHint()){
initDatas();
}
}
private void initView(View view) {
mSmartRefreshLayout = view.findViewById(R.id.fragment_page_srf);
mRecyclerView = view.findViewById(R.id.fragment_page_rl);
mRecyclerView.addItemDecoration(new MyDecoration());
StaggeredGridLayoutManager layoutManager = new StaggeredGridLayoutManager(1, StaggeredGridLayoutManager.VERTICAL);
mRecyclerView.setLayoutManager(layoutManager);
mSmartRefreshLayout.autoRefresh();
mSmartRefreshLayout.setOnRefreshListener(refreshlayout -> {
initDatas();
});
mSmartRefreshLayout.setOnLoadmoreListener(refreshlayout -> {
initDatas();
});
}
private void initAdatper() {
//這裏面需要處理的是adapter,這個很簡單,不多說了。
}
private void initDatas(){
//調用接口或者本地數據,加載數據到adapter中
}
}
6.總結
開始的時候找了很多方法來實現,但是發現一些效果都不是很好用,然後就調試發現,可以使用如上方法來完成。日後會繼續完善,不說了,擼代碼了。。。。