import android.content.Context;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v7.widget.RecyclerView;
import android.util.AttributeSet;
import android.view.MotionEvent;
import java.lang.ref.WeakReference;
/**
* @Auther: Hero
* @Date: 19.11.20 17:25:36
* @Description:
*/
public class AutoPollRecyclerView extends RecyclerView {
private static final long TIME_AUTO_POLL = 400;//可以通过调整这个数值改变滑动的速度
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 false,注释掉onTouchEvent()方法里面的stop和start方法,则列表自动滚动且不可触摸
return super.onTouchEvent(e);}
}
<surgery.hedatech.com.utils.AutoPollRecyclerView
android:id="@+id/autoRecycler"
android:layout_width="match_parent"
android:layout_height="match_parent">
</surgery.hedatech.com.utils.AutoPollRecyclerView>
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
viewById = findViewById(R.id.autoRecyclerView);
viewById.setLayoutManager(new LinearLayoutManager(this));
ArrayList<String> strings = new ArrayList<>();
for (int i = 0; i < 50; i++) {
strings.add("条目" + i);
}
ListAdapter listAdapter = new ListAdapter(this, strings);
viewById.setAdapter(listAdapter);
viewById.start();
}
@Override
protected void onDestroy() {
super.onDestroy();
viewById.stop();
}