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

     

  • 相关阅读:
    博客园电子期刊2009年6月刊发布
    今晚22:30~23:00博客程序更新
    博客园上海俱乐部活动通知(2009613)
    【意见征集补充】09'博客园T恤设计
    C# WinForm webBrowser 内嵌网页的按钮的OnClientClick事件的return false 在webBrowser中绑定onclick事件后 失效 的变通解决办法
    [转]VS2008中开发智能设备程序的一些总结收藏1
    [转]C#访问SQLite数据库
    [转]VS C# 怎么调试调试服务?
    [转]弹出窗口刷新它的父页面后。出现不重新发送信息,则无法刷新网页
    [转]外部css文件中的 BACKGROUNDIMAGE: url(..\image.gif)指定的背景图像无法显示,谁有好主意?
  • 原文地址:https://www.cnblogs.com/zhujiabin/p/7366272.html
Copyright © 2011-2022 走看看