TabLayout+ViewPager+FragmentPagerAdapter 實現懶加載(配合RecycleVIew+SmartRefreshLayout庫的使用)

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.總結

開始的時候找了很多方法來實現,但是發現一些效果都不是很好用,然後就調試發現,可以使用如上方法來完成。日後會繼續完善,不說了,擼代碼了。。。。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章