Android 【实现自动轮询的RecycleView】

Android 【实现自动轮询的RecycleView】

需求:类似医院或者商场,大屏幕无限轮播item (广告词/广告图…)

代码如下

/** * Created by Xia_焱 on 2017/8/20. */
public class AutoPollRecyclerView extends RecyclerView {

private static final long TIME_AUTO_POLL = 32;
AutoPollTask autoPollTask;
private boolean running; //标示是否正在自动轮询
private boolean canRun;//标示是否可以自动轮询,可在不需要的是否置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;
//使用弱引用持有外部类引用->防止内存泄漏
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);
}
}
}
//开启:如果正在运行,先停止->再开启
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);
}
}

开启:如果正在运行,先停止->再开启

  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中的代码如下

    @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中的代码

  mRecyclerView.setAdapter(adapter);
if (true) //保证itemCount的总个数宽度超过屏幕宽度->自己处理
mRecyclerView.start();

[希望这篇文章可以帮到你]

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/2826.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号