- 先看效果图
-
- 主要处理的地方:
- RecyclerView中Adapter的item可以无限轮询.
- RecyclerView自动滑动
- 手指按下时滑动停止,手指抬起后继续自动滑动
public class AutoPollRecyclerView extends RecyclerView {private static final long TIME_AUTO_POLL = 16;AutoPollTask autoPollTask;private boolean running; //标示是否正在自动轮询private boolean canRun;//标示是否可以自动轮询,可在不需要的是否置falsepublic 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);}@Overridepublic 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);}@Overridepublic 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()和数据填充的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;}@Overridepublic 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;}@Overridepublic void onBindViewHolder(BaseViewHolder holder, int position) {String data = mData.get(position%mData.size());holder.setText(R.id.tv_content,data);}@Overridepublic int getItemCount() {return Integer.MAX_VALUE;}}
- 最后附上Activity调用的代码
public class AutoPollRecyclerActivity extends BaseActivity {@Overrideprotected 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的总个数宽度超过屏幕宽度->自己处理mRecyclerView.start();}}
推荐一款不错的GIF图片制作软件:LICEcap