Android RecyclerView打造自動(dòng)循環(huán)效果
先看效果圖

主要處理的地方:
1、RecyclerView中Adapter的item個(gè)人可以無(wú)限輪詢(xún).
2、RecyclerView自動(dòng)滑動(dòng)
3、手指按下時(shí)滑動(dòng)停止,手指抬起后繼續(xù)自動(dòng)滑動(dòng)
public class AutoPollRecyclerView extends RecyclerView {
private static final long TIME_AUTO_POLL = 16;
AutoPollTask autoPollTask;
private boolean running; //標(biāo)示是否正在自動(dòng)輪詢(xún)
private boolean canRun;//標(biāo)示是否可以自動(dòng)輪詢(xún),可在不需要的是否置false
public AutoPollRecyclerView(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
autoPollTask = new AutoPollTask(this);
}
static class AutoPollTask implements Runnable {
private final WeakReference<AutoPollRecyclerView> mReference;
//使用弱引用持有外部類(lèi)引用->防止內(nèi)存泄漏
public AutoPollTask(AutoPollRecyclerView reference) {
this.mReference = new WeakReference<AutoPollRecyclerView>(reference);
}
@Override
public void run() {
AutoPollRecyclerView recyclerView = mReference.get();
if (recyclerView != null && recyclerView.running &&recyclerView.canRun) {
recyclerView.scrollBy(2, 2);
recyclerView.postDelayed(recyclerView.autoPollTask,recyclerView.TIME_AUTO_POLL);
}
}
}
//開(kāi)啟:如果正在運(yùn)行,先停止->再開(kāi)啟
public void start() {
if (running)
stop();
canRun = true;
running = true;
postDelayed(autoPollTask,TIME_AUTO_POLL);
}
public void stop(){
running = false;
removeCallbacks(autoPollTask);
}
@Override
public boolean onTouchEvent(MotionEvent e) {
switch (e.getAction()){
case MotionEvent.ACTION_DOWN:
if (running)
stop();
break;
case MotionEvent.ACTION_UP:
case MotionEvent.ACTION_CANCEL:
case MotionEvent.ACTION_OUTSIDE:
if (canRun)
start();
break;
}
return super.onTouchEvent(e);
}
}
Adapter處理:主要處理getItemCount()和數(shù)據(jù)填充的onBindViewHolder()方法
public class AutoPollAdapter extends RecyclerView.Adapter<BaseViewHolder> {
private final Context mContext;
private final List<String> mData;
public AutoPollAdapter(Context context, List<String> list) {
this.mContext = context;
this.mData = list;
}
@Override
public BaseViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(mContext).inflate(R.layout.item_auto_poll, parent, false);
BaseViewHolder holder = new BaseViewHolder(view);
return holder;
}
@Override
public void onBindViewHolder(BaseViewHolder holder, int position) {
String data = mData.get(position%mData.size());
holder.setText(R.id.tv_content,data);
}
@Override
public int getItemCount() {
return Integer.MAX_VALUE;
}
}
最后附上Activity調(diào)用的代碼
public class AutoPollRecyclerActivity extends BaseActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_auto_poll);
initToolBar();
initView();
}
private void initView() {
AutoPollRecyclerView mRecyclerView = (AutoPollRecyclerView) findViewById(R.id.rv_recycleView);
List<String> list = new ArrayList<>();
for (int i = 0; i < 5; ) {
list.add(" Item: " + ++i);
}
AutoPollAdapter adapter = new AutoPollAdapter(this, list);
mRecyclerView.setLayoutManager(new LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, false));
mRecyclerView.addItemDecoration(new DividerItemDecoration(this, DividerItemDecoration.HORIZONTAL_LIST));
mRecyclerView.setAdapter(adapter);
if (true) //保證itemCount的總個(gè)數(shù)寬度超過(guò)屏幕寬度->自己處理
mRecyclerView.start();
}
}
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Android中RecyclerView上拉下拉,分割線(xiàn),多條目的實(shí)例代碼
- Android RecyclerView詳解及簡(jiǎn)單實(shí)例
- Android開(kāi)發(fā)中RecyclerView模仿探探左右滑動(dòng)布局功能
- Android 中RecyclerView多種item布局的寫(xiě)法(頭布局+腳布局)
- Android基于RecyclerView實(shí)現(xiàn)高亮搜索列表
- Android RecyclerView下拉刷新和上拉加載更多
- Android中RecyclerView嵌套滑動(dòng)沖突解決的代碼片段
- Android中實(shí)現(xiàn)淘寶購(gòu)物車(chē)RecyclerView或LIstView的嵌套選擇的邏輯
- Android使用recyclerview打造真正的下拉刷新上拉加載效果
- Android 滑動(dòng)監(jiān)聽(tīng)RecyclerView線(xiàn)性流+左右劃刪除+上下移動(dòng)
- Android RecyclerView 上拉加載更多及下拉刷新功能的實(shí)現(xiàn)方法
- Android使用RecyclerView實(shí)現(xiàn)水平滾動(dòng)控件
- Android RecyclerView的Item點(diǎn)擊事件實(shí)現(xiàn)整理
相關(guān)文章
Android開(kāi)發(fā)之Parcel機(jī)制實(shí)例分析
這篇文章主要介紹了Android開(kāi)發(fā)之Parcel機(jī)制,實(shí)例分析了Parcel機(jī)制的原理與實(shí)現(xiàn)技巧,需要的朋友可以參考下2015-05-05
Android實(shí)現(xiàn)雙擊返回鍵退出應(yīng)用實(shí)現(xiàn)方法詳解
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)雙擊返回鍵退出應(yīng)用的實(shí)現(xiàn)方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-09-09
Android:如何編寫(xiě)“萬(wàn)能”的Activity
本文主要介紹了編寫(xiě)“萬(wàn)能”的Activity的方法與步驟,具有很好的參考價(jià)值,下面跟著小編一起來(lái)看下吧2017-01-01
cocos2d-2.0-x-2.0.3 交叉編譯到android報(bào)錯(cuò)解決
我用的是cocos2d-2.0-x-2.0.3 之前弄了一天也沒(méi)成功 今天來(lái)了下載了最新的ndk8 更新了sdk 又重新是了一遍 居然成功了,不知道是工具的版本問(wèn)題還是哪一步出錯(cuò)誤了,在這里詳細(xì)的整理一下,感興趣的朋友可以了解下2013-01-01
Android編程實(shí)現(xiàn)通知欄進(jìn)度條效果的方法示例
這篇文章主要介紹了Android編程實(shí)現(xiàn)通知欄進(jìn)度條效果的方法,結(jié)合實(shí)例形式較為詳細(xì)的分析了Android通知欄進(jìn)度條效果的功能、布局相關(guān)實(shí)現(xiàn)方法與操作注意事項(xiàng),需要的朋友可以參考下2018-02-02
Android TextView實(shí)現(xiàn)帶鏈接文字事件監(jiān)聽(tīng)的三種常用方式示例
這篇文章主要介紹了Android TextView實(shí)現(xiàn)帶鏈接文字事件監(jiān)聽(tīng)的方法,結(jié)合實(shí)例形式分析了鏈接跳轉(zhuǎn)、setMovementMethod及布局屬性設(shè)置三種常用的實(shí)現(xiàn)方式,需要的朋友可以參考下2017-08-08
Android Compose remember的使用和原理詳解
本文詳細(xì)介紹了Android Jetpack Compose中的remember函數(shù),它是優(yōu)化UI組件重組性能的重要工具,remember可以緩存數(shù)據(jù)或?qū)ο?避免每重組時(shí)重新計(jì)算,保持狀態(tài)不變,通過(guò)合理使用`remember`,可以提高應(yīng)用的性能和流暢度,感興趣的朋友一起看看吧2025-03-03
Android 自定義view之畫(huà)圖板實(shí)現(xiàn)方法
本文重在對(duì)自定義view,以及其常用類(lèi),常用方法的初步了解,提供一個(gè)思路,效果是其次,畫(huà)板只是例子,需要的朋友可以參考下2018-01-01
Android?獲取實(shí)時(shí)網(wǎng)速實(shí)現(xiàn)詳解
這篇文章主要為大家介紹了Android?獲取實(shí)時(shí)網(wǎng)速實(shí)現(xiàn)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-11-11

