zoukankan      html  css  js  c++  java
  • Android RecyclerView 水平滚动+自动循环轮播

    主要处理的地方: 
    1、RecyclerView中Adapter的item个人可以无限轮询. 
    2、RecyclerView自动滑动 
    3、手指按下时滑动停止,手指抬起后继续自动滑动

    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);
     }
    }

    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;
     }
     @Override
     public 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;
     }
     @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调用的代码

    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();
     }

     

  • 相关阅读:
    GenericServlet和HttpServlet有什么区别?
    什么是RMI?
    【WPF学习】第十八章 多点触控输入
    【WPF学习】第十七章 鼠标输入
    【WPF学习】第十六章 键盘输入
    【WPF学习】第十五章 WPF事件
    【WPF学习】第十四章 事件路由
    【WPF学习】第十三章 理解路由事件
    【WPF学习】第十二章 属性验证
    【WPF学习】第十一章 理解依赖项属性
  • 原文地址:https://www.cnblogs.com/zhujiabin/p/7366272.html
Copyright © 2011-2022 走看看