RecyclerView实用-打造自动循环的RecyclView

  • 先看效果图

  • 主要处理的地方:
  1. RecyclerView中Adapter的item可以无限轮询.
  2. RecyclerView自动滑动
  3. 手指按下时滑动停止,手指抬起后继续自动滑动
    
    
  1. public class AutoPollRecyclerView extends RecyclerView {
  2. private static final long TIME_AUTO_POLL = 16;
  3. AutoPollTask autoPollTask;
  4. private boolean running; //标示是否正在自动轮询
  5. private boolean canRun;//标示是否可以自动轮询,可在不需要的是否置false
  6. public AutoPollRecyclerView(Context context, @Nullable AttributeSet attrs) {
  7. super(context, attrs);
  8. autoPollTask = new AutoPollTask(this);
  9. }
  10. static class AutoPollTask implements Runnable {
  11. private final WeakReference<AutoPollRecyclerView> mReference;
  12. //使用弱引用持有外部类引用->防止内存泄漏
  13. public AutoPollTask(AutoPollRecyclerView reference) {
  14. this.mReference = new WeakReference<AutoPollRecyclerView>(reference);
  15. }
  16. @Override
  17. public void run() {
  18. AutoPollRecyclerView recyclerView = mReference.get();
  19. if (recyclerView != null && recyclerView.running &&recyclerView.canRun) {
  20. recyclerView.scrollBy(2, 2);
  21. recyclerView.postDelayed(recyclerView.autoPollTask,recyclerView.TIME_AUTO_POLL);
  22. }
  23. }
  24. }
  25. //开启:如果正在运行,先停止->再开启
  26. public void start() {
  27. if (running)
  28. stop();
  29. canRun = true;
  30. running = true;
  31. postDelayed(autoPollTask,TIME_AUTO_POLL);
  32. }
  33. public void stop(){
  34. running = false;
  35. removeCallbacks(autoPollTask);
  36. }
  37. @Override
  38. public boolean onTouchEvent(MotionEvent e) {
  39. switch (e.getAction()){
  40. case MotionEvent.ACTION_DOWN:
  41. if (running)
  42. stop();
  43. break;
  44. case MotionEvent.ACTION_UP:
  45. case MotionEvent.ACTION_CANCEL:
  46. case MotionEvent.ACTION_OUTSIDE:
  47. if (canRun)
  48. start();
  49. break;
  50. }
  51. return super.onTouchEvent(e);
  52. }
  53. }
  • Adapter处理:主要处理getItemCount()和数据填充的onBindViewHolder()方法
      
      
  1. public class AutoPollAdapter extends RecyclerView.Adapter<BaseViewHolder> {
  2. private final Context mContext;
  3. private final List<String> mData;
  4. public AutoPollAdapter(Context context, List<String> list) {
  5. this.mContext = context;
  6. this.mData = list;
  7. }
  8. @Override
  9. public BaseViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
  10. View view = LayoutInflater.from(mContext).inflate(R.layout.item_auto_poll, parent, false);
  11. BaseViewHolder holder = new BaseViewHolder(view);
  12. return holder;
  13. }
  14. @Override
  15. public void onBindViewHolder(BaseViewHolder holder, int position) {
  16. String data = mData.get(position%mData.size());
  17. holder.setText(R.id.tv_content,data);
  18. }
  19. @Override
  20. public int getItemCount() {
  21. return Integer.MAX_VALUE;
  22. }
  23. }
  • 最后附上Activity调用的代码
        
        
  1. public class AutoPollRecyclerActivity extends BaseActivity {
  2. @Override
  3. protected void onCreate(Bundle savedInstanceState) {
  4. super.onCreate(savedInstanceState);
  5. setContentView(R.layout.activity_auto_poll);
  6. initToolBar();
  7. initView();
  8. }
  9. private void initView() {
  10. AutoPollRecyclerView mRecyclerView = (AutoPollRecyclerView) findViewById(R.id.rv_recycleView);
  11. List<String> list = new ArrayList<>();
  12. for (int i = 0; i < 5; ) {
  13. list.add(" Item: " + ++i);
  14. }
  15. AutoPollAdapter adapter = new AutoPollAdapter(this, list);
  16. mRecyclerView.setLayoutManager(new LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, false));
  17. mRecyclerView.addItemDecoration(new DividerItemDecoration(this, DividerItemDecoration.HORIZONTAL_LIST));
  18. mRecyclerView.setAdapter(adapter);
  19. if (true) //保证itemCount的总个数宽度超过屏幕宽度->自己处理
  20. mRecyclerView.start();
  21. }
  22. }
推荐一款不错的GIF图片制作软件:LICEcap
  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值