RecyclerView与ViewPager2
RecyclerView與ViewPager2
文章目錄
- RecyclerView與ViewPager2
- 1:RecyclerView
- 1.1:基本使用方法
- 1.1.1定制 RecyclerView 界面
- 1.1.2創建適配器
- 1.1.3MainActivity里面的修改
- 1.2橫向滑動
- 1.2.1定制RecyclerView界面
- 1.2.2MainActivity里面的修改
- 1.3RecyclerView的一些理解
- 1.4RecyclerView的一些改進
- 1.4.1內存泄漏
- 1.5RecyclerView和ListView的區別
- 2:ViewPager2
- 2.1:基本使用方法
- 2.1.1定制ViewPager2界面
- 2.1.2創建適配器
- 2.1.3MainActivity里面修改
- 2.2:橫向滑動
- 3:RecyclerView和ViewPager2的異同點
- 4.ViewPager2與Fragment聯動效果
- 4.1:水平翻頁
- 4.11:修改Fragment(Blank)里面的布局
- 4.12:修改Fragment里面的方法
- 4.13:創建構造器
- 4.14:修改主布局
- 4.15:修改MainActivity
- 4.2:和TabLayout聯動
- 4.3:ViewPager2+Fragment實現從最后一頁滑到第一頁
1:RecyclerView
ListView具有以下幾種不足
1.沒辦法實現左右滑動,拓展性差
2.運行效率比較低,需要手動優化性能
RecyclerView可以有效的解決這些問題,這也是為什么RecyclerView逐漸取代了ListView
1.1:基本使用方法
以前的Android Studio要想使用RecyclerView必須得在build.gradle (Moudule) 的 dependencies中加入
implementation("androidx.recyclerview:recyclerview:1.2.1") implementation("androidx.recyclerview:recyclerview-selection:1.1.0")而我用的Android Studio 2021.3.1不用加入以上代碼,就可以直接用
1.1.1定制 RecyclerView 界面
修改activity_main.xml 中的代碼
<?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"tools:context=".MainActivity"><androidx.recyclerview.widget.RecyclerViewandroid:layout_width="match_parent"android:layout_height="match_parent"android:id="@+id/recycle_view_0"/> </LinearLayout>在res中的layout下面建一個item.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="wrap_content"android:layout_height="wrap_content"><TextViewandroid:id="@+id/text_view"android:layout_width="match_parent"android:layout_height="wrap_content" /> </LinearLayout>這個xml文件時用來展示RecyclerView 中的每個數據項,
我們來看一看它的design
構建一個類,這個類是用來說明對象的屬性
比如我的RecyclerView里面要展示的是對象的姓名
package com.example.recycleview_0; public class idol {public String getName() {return name;}public void setName(String name) {this.name = name;}public String name; }1.1.2創建適配器
為什么要創建一個適配器呢,因為數據是無法直接傳遞給RecyclerView的(和ListView一樣),我們需要適配器
適配器的初始化:
package com.example.recycleview_0; import android.view.View; import android.view.ViewGroup; import androidx.annotation.NonNull; import androidx.recyclerview.widget.RecyclerView; public class Adapter_0 extends RecyclerView.Adapter<Adapter_0.Adapter_0Holder> {@NonNull@Overridepublic Adapter_0.Adapter_0Holder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {return null;}@Overridepublic void onBindViewHolder(@NonNull Adapter_0.Adapter_0Holder holder, int position) {}@Overridepublic int getItemCount() {return 0;}public class Adapter_0Holder extends RecyclerView.ViewHolder {public Adapter_0Holder(@NonNull View itemView) {super(itemView);}} }首先我們先定義了一個內部類Adapter_0Holder
Adapter_0Holder要繼承RecyclerView.ViewHolder然后Adapter_0Holder的構造函數里面要傳入一個View參數,這個參數通常就是RecyclerView子項的最外層布局,我們可以通過findViewById()獲取布局中的TextView實例
public class Adapter_0Holder extends RecyclerView.ViewHolder {TextView mTextView;public Adapter_0Holder(@NonNull View itemView) {super(itemView);mTextView = itemView.findViewById(R.id.text_view);//這個R.id.text_view就是你res中的layout下面item.xml里的東西} }這時候我們再來完善Adapter_0里面的內容
我們先在Adapter_0里面添加一個構造方法,便于將要展示的值傳進來
private List<idol>mIdols; public Adapter_0(List<idol> idols) {mIdols = idols; }然后再重寫里面的onCreateViewHolder(),onBindViewHolder(),**getItemCount()**方法
@NonNull @Override public Adapter_0Holder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item,parent,false);return new Adapter_0Holder(view); }onCreateViewHolder()方法是用于創建Adapter_0Holder實例,我們在這個方法中將item布局加載進來,創建一個Adapter_0Holder實例,并把加載出來的布局傳入到構造函數中,最后將Adapter_0Holder的實例返回
@Override public void onBindViewHolder(@NonNull Adapter_0Holder holder, int position) { idol idol = mIdols.get(position); holder.mTextView.setText(idol.getName()); }onBindViewHolder()是用于對RecyclerView子項的數據進行賦值操作,每個子項被滾動到屏幕內時會執行,通過position得到當前項的idol實例,然后將數據設置到Adapter_0Holder中的TextView中
@Override public int getItemCount() {return mIdols.size(); }getItemCount()用來告訴RecycleView一共有多少子項,直接返回數據源的長度就行了
| Adapter_0的構造方法 | 便于將要展示的值傳進來 |
| onCreateViewHolder() | 創建一個Adapter_0Holder實例(創建內部類的實例),把加載的布局傳入內部類Adapter_0Holder的構造方法中,最后返回Adapter_0Holder這個實例 |
| 內部類Adapter_0Holder | 有用的主要是它的構造方法,用findViewById將item中的TextView實例化 |
| onBindViewHolder() | onBindViewHolder()里面有一個參數是postion,我們就根據這個postion給相應的子項賦值 |
| getItemCount() | 返回RecycleView中的子項的長度 |
1.1.3MainActivity里面的修改
public class MainActivity extends AppCompatActivity {List<idol>mIdols = new ArrayList<>();@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);init();RecyclerView recyclerView = findViewById(R.id.recycle_view_0);LinearLayoutManager linearLayout = new LinearLayoutManager(this);recyclerView.setLayoutManager(linearLayout);Adapter_0 adapter_0 = new Adapter_0(mIdols);recyclerView.setAdapter(adapter_0);}private void init(){for(int i=0;i<100;i++){idol idol = new idol();idol.name="向晚";mIdols.add(idol);}} }| init() | 初始化所有的數據 |
| RecyclerView recyclerView = findViewById(R.id.recycle_view_0) | 將RecyclerView實例化 |
| LinearLayoutManager linearLayout = new LinearLayoutManager(this) | 指定RecyclerView的布局 |
| recyclerView.setLayoutManager(linearLayout) | 完成RecyclerView布局的適配設置 |
| Adapter_0 adapter_0 = new Adapter_0(mIdols) | 創建Adapter_0實例 |
| recyclerView.setAdapter(adapter_0) | 完成適配器的設置,RecyclerView和數據之間的關聯就建立了 |
效果如下
可以向下滑動
1.2橫向滑動
橫向滑動就比縱向滑動多了幾行代碼,很簡單
1.2.1定制RecyclerView界面
在res中的layout里的item.xml中加一行代碼
android:orientation="vertical";1.2.2MainActivity里面的修改
在LinearLayoutManager下面加一句
linearLayout.setOrientation(LinearLayoutManager.HORIZONTAL);下面是效果
可以左右滑動
1.3RecyclerView的一些理解
我們在onCreateViewHolder和onBindViewHolder中分別加上
Log.d(“TAG”,“onCreateViewHolder”);
Log.d(“TAG”,“onBindViewHolder”);
當剛開啟虛擬機的時候:
有14個向晚
這時候你再看Logcat
你會發現Logcat里面分別有14個onCreateViewHolder和14個onBindViewHolder
(而且,Logcat里面是出現一個onCreateViewHolder就出現一個onBindViewHolder)
這個RecyclerView是可以左右滑動的,這時候,我們將RecyclerView右滑
看Logcat
設置一個i=0;
設置一個n=0;
每次執行一次onBindViewHolder,讓i++
每次執行一次onCreateViewHolder讓n++
你會發現當n=19后,就再也不增加了即onCreateViewHolder不再執行
而i會一直增加,即onBindViewHolder會一直執行
我原本以為是向晚輸的太少,當我輸200個向晚后,發現依然n=19就不增加了
當我把字體的大小改變時,發現n的大小發生了改變
且是textSize越大,n的最大值越小
1.4RecyclerView的一些改進
在開發過程中有一個約定俗成的一點就是,盡量不要讓過多的item暴露出來
,因為item過多的話容易導致內存泄漏
1.4.1內存泄漏
內存泄露是指:內存泄漏也稱作"存儲滲漏",用動態存儲分配函數動態開辟的空間,在使用完畢后未釋放,結果導致一直占據該內存單元。直到程序結束。(其實說白了就是該內存空間使用完畢之后未回收)即所謂內存泄漏。
解決的方法就是在**onBindViewHolder()方法中將holder.mTextView.setText(idol.getName())中的mTextView.setText(idol.getName())**封裝,
在內部類的構造方法中
public void bind(String text){mTextView.setText(text); }然后
@Override public void onBindViewHolder(@NonNull Adapter_0.Adapter_0Holder holder, int position) { idol idol = mIdols.get(position); holder.bind(idol.getName()); ++i;Log.d("TAG","onBindViewHolder"+i); }其實內存泄漏也不能這么說,這樣優化的目的就是為了:讓本來就應該干這個的方法干這件事
1.5RecyclerView和ListView的區別
| 可以實現左右滑動 | 不能實現左右滑動 |
| onCreateViewHolder執行的次數一定小于等于item的個數 | onCreateViewHolder等于item的個數 |
| 有回收機制 | 沒有回收機制 |
2:ViewPager2
ViewPager1據說比較惡心,那就不看了,ViewPager2的操作和RecyclerView的操作差不多
RecyclerView的直觀感受就是可以左右滑動或者上下滑動
而ViewPager2的直觀感受就是實現水平翻頁的效果
2.1:基本使用方法
2.1.1定制ViewPager2界面
修改activity_main.xml 中的代碼
<?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"tools:context=".MainActivity"><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text=""app:layout_constraintBottom_toBottomOf="parent"app:layout_constraintEnd_toEndOf="parent"app:layout_constraintStart_toStartOf="parent"app:layout_constraintTop_toTopOf="parent" /><androidx.viewpager2.widget.ViewPager2android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"android:id="@+id/viewpager2"/> </LinearLayout>在res中的drawable下放一張abc.jpg
然后在res中的layout下面新建一個item.xml
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"><TextViewandroid:layout_width="match_parent"android:layout_height="wrap_content"android:textSize="20dp"android:id="@+id/textview_0"/><ImageViewandroid:layout_below="@+id/textview_0"android:layout_width="match_parent"android:layout_height="match_parent"android:id="@+id/image_0"/> </RelativeLayout>看看它的design
然后在原來MainActivity所在的包下新建一個類
還是把它命名為idol
為了能明顯看出切換的效果,我們在里面不僅定義了name,還定義了picture
package com.example.viewpage2_0; public class idol {public String name;public String getName() {return name;}public void setName(String name) {this.name = name;}public int getPicture() {return picture;}public void setPicture(int picture) {this.picture = picture;}public int picture; }2.1.2創建適配器
package com.example.viewpage2_0; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; import android.widget.TextView; import androidx.annotation.NonNull; import androidx.recyclerview.widget.RecyclerView; import java.util.List; public class recyclerView_0 extends RecyclerView.Adapter<recyclerView_0.recyclerView_0Holder> {public recyclerView_0(List<idol> idols) {mIdols = idols;}private List<idol>mIdols;@NonNull@Overridepublic recyclerView_0.recyclerView_0Holder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item,parent,false);return new recyclerView_0Holder(view);}@Overridepublic void onBindViewHolder(@NonNull recyclerView_0.recyclerView_0Holder holder, int position) {idol idol = mIdols.get(position);holder.mImageView.setImageResource(idol.getPicture());holder.mTextView.setText(idol.getName());}@Overridepublic int getItemCount() {return mIdols.size();}public class recyclerView_0Holder extends RecyclerView.ViewHolder {TextView mTextView;ImageView mImageView;public recyclerView_0Holder(@NonNull View itemView) {super(itemView);mTextView = itemView.findViewById(R.id.textview_0);mImageView = itemView.findViewById(R.id.image_0);}} }這塊和RecyclerView基本一模一樣
所以沒啥必要再寫
2.1.3MainActivity里面修改
public class MainActivity extends AppCompatActivity {private List<idol>mIdols = new ArrayList<>();@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);init();ViewPager2 viewPager2 = findViewById(R.id.viewpager2);recyclerView_0 horizontalVpAdapter = new recyclerView_0(mIdols);viewPager2.setAdapter(horizontalVpAdapter);}private void init(){for(int i = 0;i<3;i++){idol idol = new idol();idol.name = "關注向晚大魔王";idol.picture=R.drawable.abc;mIdols.add(idol);}} }你會發現這塊和RecyclerView也差不多
為數不多的不同點就是ViewPager2里面不用指定布局還有布局的適配
來,我們來看看效果
我不知道咋弄動圖,反正就是可以向下滑
2.2:橫向滑動
這塊也和RecyclerView差不多
在layout.item里面加入:
android:orientation="vertical"在活動中加一句
viewPager2.setOrientation(ViewPager2.ORIENTATION_HORIZONTAL);更簡單了
3:RecyclerView和ViewPager2的異同點
| 不同點 | RecyclerView需要實例化布局,而ViewPager2不需要 | 正因為RecyclerView布局需要實例化,ViewPager2不需要,所以RecyclerView的實現左右滑動要稍微比ViewPager2麻煩 |
4.ViewPager2與Fragment聯動效果
其實在寫ViewPager2的時候我就在想,當用ViewPager2時,能不能實現無限滑動的效果
我想的是在MainActivity的init()方法里面,在for循環中加一句(因為我的i是從0開始,等于3的時候結束),i=3時,i又等于了0,感覺沒問題,覺得可以實現這個功能,但是直接應用閃退。
突然想了一下,應該是因為ViewPager2的回收機制
,然后突然發現,ViewPager2與Fragment聯動好像可以解決這個問題
Fragment是Activity的一部分,或者頁面的一部分,當頁面上的內容太多需要針對性加載時可以采用Fragment;ViewPager2是管理多個Fragment的工具.
4.1:水平翻頁
先在MainActivity所在的包下建立一個Fragment(Blank)
并且修改**Fragment(Blank)**里面的布局
4.11:修改Fragment(Blank)里面的布局
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:background="@color/white"tools:context=".BlankFragment"android:orientation="vertical"><TextViewandroid:id="@+id/mTextView"android:layout_width="match_parent"android:layout_height="wrap_content"android:textSize="36sp"android:gravity="center"/><TextViewandroid:layout_width="match_parent"android:layout_height="wrap_content"android:textSize="36sp"android:id="@+id/anotherTextView"android:gravity="center"/> </LinearLayout>這是它的design
4.12:修改Fragment里面的方法
package com.example.viewpage2_1; import android.os.Bundle; import androidx.fragment.app.Fragment; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; /*** A simple {@link Fragment} subclass.* Use the {@link BlankFragment#newInstance} factory method to* create an instance of this fragment.*/ public class BlankFragment extends Fragment {// TODO: Rename parameter arguments, choose names that match// the fragment initialization parameters, e.g. ARG_ITEM_NUMBERprivate static final String ARG_PARAM1 = "param1";private static final String ARG_PARAM2 = "param2";// TODO: Rename and change types of parametersprivate String mParam1;private String mParam2;public BlankFragment() {// Required empty public constructor}/*** Use this factory method to create a new instance of* this fragment using the provided parameters.** @param param1 Parameter 1.* @param param2 Parameter 2.* @return A new instance of fragment BlankFragment.*/// TODO: Rename and change types and number of parameterspublic static BlankFragment newInstance(String param1, String param2) {BlankFragment fragment = new BlankFragment();Bundle args = new Bundle();args.putString(ARG_PARAM1, param1);args.putString(ARG_PARAM2, param2);fragment.setArguments(args);return fragment;}@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);if (getArguments() != null) {mParam1 = getArguments().getString(ARG_PARAM1);mParam2 = getArguments().getString(ARG_PARAM2);}}@Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {// Inflate the layout for this fragmentreturn inflater.inflate(R.layout.fragment_blank, container, false);} }這是剛才建立Fragment(Blank)時自動補充的代碼
onCreate()上面的方法基本上用不著可以先不看
onCreate()里面的代碼基本不用改
但是為了方便觀察,我們在里面加上Log.d
public static BlankFragment newInstance(String param1, String param2) {Log.d("BlankFragment","newInstance: 從主函數那邊調過來創建碎片的實例");BlankFragment fragment = new BlankFragment();Bundle args = new Bundle();args.putString(ARG_PARAM1, param1);args.putString(ARG_PARAM2, param2);fragment.setArguments(args);return fragment;}@Overridepublic void onCreate(Bundle savedInstanceState) {Log.d("BlankFragment","onCreate: 在這里創建碎片");super.onCreate(savedInstanceState);if (getArguments() != null) {mParam1 = getArguments().getString(ARG_PARAM1);mParam2 = getArguments().getString(ARG_PARAM2);}}@Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {Log.d("BlankFragment","onCreateView: 在這里加載視圖");// Inflate the layout for this fragmentreturn inflater.inflate(R.layout.fragment_blank, container, false);}引入一個View方便后面的操作
View rootView; public static BlankFragment newInstance(String param1, String param2) {Log.d("BlankFragment","newInstance: 從主函數那邊調過來創建碎片的實例");BlankFragment fragment = new BlankFragment();Bundle args = new Bundle();args.putString(ARG_PARAM1, param1);args.putString(ARG_PARAM2, param2);fragment.setArguments(args);return fragment;}@Overridepublic void onCreate(Bundle savedInstanceState) {Log.d("BlankFragment","onCreate: 在這里創建碎片");super.onCreate(savedInstanceState);if (getArguments() != null) {mParam1 = getArguments().getString(ARG_PARAM1);mParam2 = getArguments().getString(ARG_PARAM2);}}@Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {Log.d("BlankFragment","onCreateView: 在這里加載視圖");// Inflate the layout for this fragmentif(rootView == null) {rootView = inflater.inflate(R.layout.fragment_blank, container, false);}initView();return rootView;}private void initView() {TextView textView = rootView.findViewById(R.id.mTextView);TextView textView1 = rootView.findViewById(R.id.anotherTextView);textView.setText(mParam1);textView1.setText(mParam2);}4.13:創建構造器
再創建一個適配器
public class MyAdapter extends FragmentStateAdapter { }這時候它會提示你,讓你重寫2個方法,分別是
@NonNull @Override public Fragment createFragment(int position) {return null; }@Override public int getItemCount() {return 0; }并且讓你寫出它的構造方法
public MyAdapter(@NonNull FragmentManager fragmentManager, @NonNull Lifecycle lifecycle) {super(fragmentManager, lifecycle); }public class MyAdapter extends FragmentStateAdapter { private static final String TAG = "MyAdapter"; List<Fragment> fragments = new ArrayList<>();public MyAdapter(@NonNull FragmentManager fragmentManager, @NonNull Lifecycle lifecycle, List<Fragment> fragments) {super(fragmentManager, lifecycle);Log.d(TAG, "MyAdapter: 這是那個適配器的構造函數");this.fragments = fragments;Log.d(TAG, "MyAdapter: "); }@NonNull @Override public Fragment createFragment(int position) {Log.d(TAG, "createFragment: 看看這是第幾個視圖" + position);return fragments.get(position); }@Override public int getItemCount() {return fragments.size(); } }
4.14:修改主布局
<?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"tools:context=".MainActivity"><androidx.viewpager2.widget.ViewPager2android:layout_width="match_parent"android:layout_height="0dp"android:layout_weight="1"android:id="@+id/myViewPager"android:background="@color/purple_500"/> </LinearLayout>4.15:修改MainActivity
public class MainActivity extends AppCompatActivity {ViewPager2 viewPager2;private List<Fragment> fragments = new ArrayList<>();@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);initPage();viewPager2 = findViewById(R.id.myViewPager);MyAdapter myAdapter = new MyAdapter(getSupportFragmentManager(),getLifecycle(),fragments);viewPager2.setAdapter(myAdapter);}private void initPage() {fragments.add(BlankFragment.newInstance("好好好","1"));fragments.add(BlankFragment.newInstance("棒棒棒","2"));fragments.add(BlankFragment.newInstance("good","3"));fragments.add(BlankFragment.newInstance("better","4"));} }向右滑動的效果
4.2:和TabLayout聯動
首先先在MainActivity的layout里面加上
<com.google.android.material.tabs.TabLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:id="@+id/tabLayout"/>MainActivity里面加上
tabLayout = findViewById(R.id.tabLayout);new TabLayoutMediator(tabLayout, viewPager2, new TabLayoutMediator.TabConfigurationStrategy() {@Overridepublic void onConfigureTab(@NonNull TabLayout.Tab tab, int position) {tab.setText(tablayoutdata.get(position));}}).attach(); }private void initPage() {fragments.add(BlankFragment.newInstance("我最帥","1"));fragments.add(BlankFragment.newInstance("我最丑","2"));fragments.add(BlankFragment.newInstance("我很帥","3"));fragments.add(BlankFragment.newInstance("我很丑","4"));tablayoutdata.add("1");tablayoutdata.add("2");tablayoutdata.add("3");tablayoutdata.add("4");}效果如圖
可以通過按下面的鍵實現跳躍
4.3:ViewPager2+Fragment實現從最后一頁滑到第一頁
適配器里面的東西完全不用改變
在MainActivity里面加上
viewPager2.registerOnPageChangeCallback(new ViewPager2.OnPageChangeCallback() {@Overridepublic void onPageSelected(int position) {if(position==4){viewPager2.setCurrentItem(0,false);}} });private void initPage() {fragments.add(BlankFragment.newInstance("好好好","1"));fragments.add(BlankFragment.newInstance("棒棒棒","2"));fragments.add(BlankFragment.newInstance("good","3"));fragments.add(BlankFragment.newInstance("better","4"));fragments.add(BlankFragment.newInstance("好好","1"));tablayoutdata.add("1");tablayoutdata.add("2");tablayoutdata.add("3");tablayoutdata.add("4");tablayoutdata.add("5");}至于為什么這么寫呢,我只能說這是我為數不多會的了
和那種真正的輪流播放還是存在一定的差距的,你會發現和上面那張圖比起來,TabLayout里面多了1個5
我的想法就是多弄了一個ViewPager2,最后一個ViewPager2和第一個Viewpager2設置的一摸一樣,當它的TabLayout的值為4的時候,就已經進行到第5個ViewPager2了,這時候直接跳回到第一個ViewPager2就實現了這個
至于為什么要把最后一個和第一個設置成一樣的,那是因為如果我把TabLayout去掉的話,就不容易看出來我寫了5個ViewPager2而只會以為我寫了4個
總結
以上是生活随笔為你收集整理的RecyclerView与ViewPager2的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 设计模式:UML类图、策略模式、单例模式
- 下一篇: 性能分析之排队论应用