1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071 |
- package com.edufound.reader.cusview;
- import android.content.Context;
- import android.util.AttributeSet;
- import android.view.MotionEvent;
- import java.lang.ref.WeakReference;
- import androidx.recyclerview.widget.RecyclerView;
- import io.reactivex.rxjava3.annotations.Nullable;
- public class AutoPollRecyclerView extends RecyclerView {
- private static final long TIME_AUTO_POLL = 16;
- 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);
- }
- }
|