用RecyclerView(ViewPager2)代替ViewPager實(shí)現(xiàn)Banner無限循環(huán)

一:描述

1: 既然是輪播就是內(nèi)容模塊大致相同,RecyclerView擁有強(qiáng)大的緩存機(jī)制可以直接實(shí)現(xiàn)相同Item的緩存

2: RecyclerView的Adapter可以針對不同Item的 ViewType來緩存不同的Item

3: ViewPager在生成Item的時(shí)候(Object instantiateItem(ViewGroup container, final int position))控件還未添加到ViewPager中,此時(shí)生成的Item中的控件的生命周期都沒有觸發(fā),(比如獲取Item控件的大小就無法做到), 而RecyclerView適配器中有onBindViewHolder機(jī)制與onViewRecycled, onViewAttachedToWindow,onViewDetachedFromWindow等強(qiáng)大的生命周期機(jī)制

4: RecyclerView已經(jīng)自帶的解決了與ViewPager, RecyclerView等滑動(dòng)控件中的嵌套滑動(dòng)沖突

5: 當(dāng)Banner嵌套在RecyclerView或ListView中時(shí), 在Banner滑動(dòng)動(dòng)畫還結(jié)束時(shí),如果列表滑動(dòng)緩存了banner,此時(shí)ViewPager方式的Banner會出現(xiàn)動(dòng)畫停留甚至白屏的效果,而RecyclerView可以完美的解決這問題

6: RecyclerView自帶是否預(yù)加載(即懶加載)功能,可以垂直方向,水平方向滑動(dòng), 及各種很炫的效果,?項(xiàng)目中已經(jīng)有了

7: 實(shí)現(xiàn)無限循環(huán)有兩種機(jī)制, 1: (非常不建議用此方式)把itemcount設(shè)置成Integer.Max_VALUE, 但是在頁面刷新setCurrentItem的時(shí)候會出現(xiàn)卡頓ANR 2: 在實(shí)際的iteCount前后添加最后一個(gè)和第一個(gè)item(這種方式有個(gè)BUG就是在快速滑動(dòng)或者多指滑動(dòng)時(shí)會到達(dá)邊界點(diǎn)就滑不動(dòng)了), 但是ViewPager是需要預(yù)加載的, 在滑動(dòng)到最后一項(xiàng)快速換位的時(shí)候,會出現(xiàn)空白,?這里的無限循環(huán)是在前后增加一定的數(shù)量的item

嵌套在RecyclerView中的方式



垂直與水平方向

二:功能及要解決的問題

1: Banner指示器?亦可用于ViewPager, ViewPager2等的指示器使用簡單,?可用引導(dǎo)界面,?只需要配置indicatorDrawable可以實(shí)現(xiàn)任何drawable的指示器效果如上圖,?并在BannerPager中setupWithIndicator(IndicatorView indicatorView)?直接綁定指示器

```

android:id="@+id/iv"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_gravity="bottom|center_horizontal"

android:layout_marginBottom="10dp"

app:indicatorDrawable="@drawable/bg_banner2"

app:indicatorOrientation="horizontal"

app:indicatorMargin="10dp"/>

```

2.?增加BannerPager.setLifecycleOwner(LifecycleOwner owner)方法讓BannerPager在Activity/Fragment/ RecyclerView中使用更加簡單方便,只要設(shè)置好適配器其他不用管

3.?在第一個(gè)版本中BannerPager的Adapter直接使用Recycler.Adapter這將導(dǎo)致ViewHolder在使用時(shí)getPostion,getAdapterPosition會獲取到錯(cuò)誤的數(shù)據(jù),?迭帶版本已經(jīng)優(yōu)化此問題

4.?修改RecyclerView滑動(dòng)動(dòng)畫時(shí)間,?且當(dāng)動(dòng)畫時(shí)間較長時(shí)在停止Banner時(shí)較正當(dāng)前item的位置

5.?無限滑動(dòng)時(shí), 在滑動(dòng)到末尾時(shí)校正當(dāng)前position的防止重復(fù)onBindViewHolder處理

6.沒有那些過渡的封裝,?就簡單幾個(gè)類,?示例代碼中有DataBinding的方式,?您可以盡情的擴(kuò)展

implementation? 'com.github.youxiaochen:RecyclerViewBanner:1.2.1'

最后源碼地址?https://github.com/youxiaochen/RecyclerViewBanner

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

相關(guān)閱讀更多精彩內(nèi)容

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