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

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

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

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

赞 (0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • ip addr命令设置网关_linux查不到ip地址

    ip addr命令设置网关_linux查不到ip地址删除ip:echo”##########osremovevip”ipaddrdel192.168.56.101/24devbond0labelbond0:1ipaddrdel192.168.165.101/24devbond1labelbond1:1echo”##########osremovephyip”ipaddrdel192…

    2022年7月27日
  • gg修改器修改数值没有用怎么办_gg修改器怎么用怎么修改数值 修改数值方法介绍…[通俗易懂]

    gg修改器修改数值没有用怎么办_gg修改器怎么用怎么修改数值 修改数值方法介绍…[通俗易懂]gg修改器怎么用怎么修改数值修改数值方法介绍GG修改器-全称GameGuardian是非常好用的手机修改器,但它需要ROOT权限,而现在要想ROOT一台手机难度是很大的,因此,本文介绍最新的GG修改免ROOT框架使用方法。现在市面上很多多开框架都支持ROOT,但支持最新安卓Q或者安卓11的却很少,并且运行GG修改器时会经常报错。并且,很多用户发现GG修改器也很难下载。X8沙箱,据说拥有完整系统级别…

    2022年9月5日
  • Python中break和continue的区别

    Python中break和continue的区别大部分人总是会搞混break和continue,虽然他们都是结束循环,但是结束的方式并不一样。break用于结束整个循环。continue用于结束当前循环。**1.**break有时候我们写代码时想让它结束整个循环,除了条件达到False结束,我们可以设定一个条件,当他达到这个条件时,结束整个循环。break用于完全跳出循环,执行循环体后面的语句。whileTrue:s=i…

    2022年5月26日
  • 计算机网络-常见洪水攻击「建议收藏」

    计算机网络-常见洪水攻击「建议收藏」什么是洪水攻击洪水攻击(FLOODATTACK)是指利用计算机网络技术向目标主机发送大量无用的数据报文,使得目标主机忙于处理无用的数据报文而无法提供正常服务的网络行为。主要原理:利用了网络协议中安

    2022年8月6日
  • java学习——java面试【事务、锁、多线程】资料整理

    成长之路,一起走!总结一些知识,方面自己学习,也方面热爱学习的伙伴们可以更好的成长! 项目直接是静态的Html,下载后可以直接访问! 地址:https://github.com/dufyun/kuyu/tree/master/kuyuTechHtml

    2022年2月25日
  • javascript typescript_typescript python

    javascript typescript_typescript python前言:无论在学习什么语言的时候,我们都需要明白其该怎么样去定义一个变量或者Function,那么今天我们来看看TypeScript的数据类型。文章目录:一.Ts与Js的区别二.Ts的数据![在这里插入图片描述](https://img-blog.csdnimg.cn/8904446afa764db282b731721429ebda.png)三.数据类型应用1.any类型:2.number类型:3.string类型:4.Array类型:(1).[]:(2).数组泛型:一.Ts与Js的区别众所周知:Jav

    2022年8月20日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

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