Android 【实现自动轮询的RecycleView】

Android 【实现自动轮询的RecycleView】

需求:类似医院或者商场,大屏幕无限轮播item (广告词/广告图…)

代码如下

/** * Created by Xia_焱 on 2017/8/20. */

public class AutoPollRecyclerView extends RecyclerView {
   
    private static final long TIME_AUTO_POLL = 32;
    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);
    }
}

开启:如果正在运行,先停止->再开启

  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中的代码如下

    @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中的代码

  mRecyclerView.setAdapter(adapter);
        if (true) //保证itemCount的总个数宽度超过屏幕宽度->自己处理
            mRecyclerView.start();

[希望这篇文章可以帮到你]

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/2826.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • Java上传文件到数据库「建议收藏」

    Java上传文件到数据库「建议收藏」Java上传文件到数据库   首先在开始本文之前推荐一篇我非常喜欢的博主——孤傲苍狼的一篇相关博文。     JavaWeb学习总结(五十)——文件上传和下载        http://www.cnblogs.com/xdp-gacl/p/4200090.html     本文主要介绍如何将文件上传到服务器,并以二进制字符流的形式存入数据库。

  • 红模仿在说谁(评价红模仿)

    各位读者,知识无穷而人力有穷,所以,要么改需求,要么找专业人士,要么自己研究。大家可以点赞、收藏、关注、评论我啦、需要完整文件随时联系我或交流哟~!

  • 学生选课管理系统c语言课程设计_大一c语言学生选课系统代码

    学生选课管理系统c语言课程设计_大一c语言学生选课系统代码《学生选课管理系统c语言程序》由会员分享,可在线阅读,更多相关《学生选课管理系统c语言程序(38页珍藏版)》请在人人文库网上搜索。1、include#include#includeintN1、N2;结构成本*头部1;structstudent*head2;结构课程/课程信息结构举止intnum1;/课程编号charname120;/课程名称chartype20;/课程性质int…

    2022年10月15日
  • BT Tracker服务器_bt服务器

    BT Tracker服务器_bt服务器有时候用BT软件下载文件的时候,经常会碰到没速度的情况,这个时候你就需要设置BTTracker服务器地址了。网上有人专门做了一个列表放在github上面,不定时更新。BitComet软件可以直接添加URL,然后设置启动时更新。项目地址:https://github.com/ngosang/trackerslist(长期更新)trackers_best(20tracker…

  • (精华)转:RDD:创建的几种方式(scala和java)

    (精华)转:RDD:创建的几种方式(scala和java)转:https://blog.csdn.net/weixin_38750084/article/details/82769600下面开始初始化sparkspark程序需要做的第一件事情,就是创建一个SparkContext对象,它将告诉spark如何访问一个集群,而要创建一个SparkContext对象,你首先要创建一个SparkConf对象,该对象访问了你的应用程序的信息比如下面的代码是运行在spark模式下 publicclasssparkTestCon{ …

  • uwsgi php,Nginx+uWSGI[通俗易懂]

    uwsgi php,Nginx+uWSGI[通俗易懂]基于python的web项目,常见的部署方法有:fcgi:用spawn-fcgi或者框架自带的工具对各个project分别生成监听进程,然后和http服务互动。wsgi:利用http服务的mod_wsgi模块来跑各个project。不过还有个uwsgi,它既不用wsgi协议也不用fcgi协议,而是自创了一个uwsgi的协议,据作者说该协议大约是fcgi协议的10倍那么快。uWSGI的主要特点如下:…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号