Android 实现列表倒计时功能

单个计时器,然后遍历数据 刷新条目;

两种实现方式:1、Handler轮询; 2、子线程睡眠(时间到后 移除列表中的条目会有问题);

代码很简单,没有任何难度,列表使用 RecyclerView+BaseRecyclerViewAdapterHelper实现;

implementation 'androidx.recyclerview:recyclerview:1.1.0'
 implementation 'com.github.CymChad:BaseRecyclerViewAdapterHelper:3.0.1'

public class MainActivity extends AppCompatActivity {
 private RecyclerView rv;
 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);
  rv = findViewById(R.id.rv);
  initView();
  initData();
  findViewById(R.id.btn).setOnClickListener(new View.OnClickListener() {
   @Override
   public void onClick(View view) {
    quickAdapter.addData(0,new TimeBean("附加商品、离活动结束还剩:" , 99));
    rv.scrollToPosition(0);
   }
  });
 }
 private QuickAdapter quickAdapter;
 private void initView() {
  quickAdapter = new QuickAdapter(R.layout.item);
  rv.setLayoutManager(new LinearLayoutManager(this));
  rv.setAdapter(quickAdapter);
  rv.setItemAnimator(null);
  Countdown();
 }
 private void initData() {
  List<TimeBean> datas = new ArrayList<>();
  for (int i = 1; i < 10; i++) {
   datas.add(new TimeBean("商品" + i + "、离活动结束还剩:", (i + 5) * i));
  }
  quickAdapter.setNewData(datas);
 }
 private class QuickAdapter extends BaseQuickAdapter<TimeBean, BaseViewHolder> {
  public QuickAdapter(int layoutResId) {
   super(layoutResId);
  }
  @Override
  protected void convert(BaseViewHolder vh, TimeBean datas) {
   vh.setText(R.id.tv, datas.getStr() + "");
   vh.setText(R.id.tv2, datas.getTime() + "s");
  }
 }
 private Handler mHandler = new Handler();
 private Runnable runnable;
 private void Countdown() {
  runnable = new Runnable() {
   @Override
   public void run() {
    for (int i = 0; i < quickAdapter.getData().size(); i++) {
     TimeBean bean = quickAdapter.getData().get(i);
     if (bean.getTime() > 0) {
      bean.setTime(bean.getTime() - 1);
      quickAdapter.setData(i, bean);
     } else {
      quickAdapter.remove(i);
     }
    }
    mHandler.postDelayed(runnable, 1000L);
   }
  };
  mHandler.postDelayed(runnable, 1000L);
 }
 private void Countdown2() {
  new Thread(new Runnable() {
   @Override
   public void run() {
    while (true){
     SystemClock.sleep(1000L);
     for (int i = 0; i < quickAdapter.getData().size(); i++) {
      final TimeBean bean = quickAdapter.getData().get(i);
      final int finalI = i;
      if (bean.getTime() > 0) {
       bean.setTime(bean.getTime() - 1);
       runOnUiThread(new Runnable() {
        @Override
        public void run() {
         quickAdapter.setData(finalI, bean);
        }
       });
      } else {
       // 当时间是0时 移除条目(子线程加睡眠模式移除条目有问题,原因时数据源未更新)
       runOnUiThread(new Runnable() {
        @Override
        public void run() {
         quickAdapter.remove(finalI);
        }
       });
      }
     }
    }
   }
  }).start();
 }
 @Override
 protected void onDestroy() {
  super.onDestroy();
  mHandler.removeCallbacks(runnable);
  mHandler.removeCallbacksAndMessages(null);
  mHandler = null;
 }
public class TimeBean {
 public TimeBean(String str, int time) {
  this.str = str;
  this.time = time;
 }
 private String str;
 private int time;
}

Get 、 Set方法就不写了;

布局文件:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 xmlns:tools="http://schemas.android.com/tools"
 android:layout_width="match_parent"
 android:layout_height="match_parent"
 android:orientation="vertical"
 tools:context=".MainActivity">
 <Button
  android:layout_width="match_parent"
  android:layout_height="wrap_content"
  android:id="@+id/btn"
  android:text="ADD"
  />
 <androidx.recyclerview.widget.RecyclerView
  android:id="@+id/rv"
  android:layout_width="match_parent"
  android:layout_height="match_parent"></androidx.recyclerview.widget.RecyclerView>
</LinearLayout>
//下面是item
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 android:layout_width="match_parent"
 xmlns:tools="http://schemas.android.com/tools"
 android:orientation="horizontal"
 android:paddingBottom="@dimen/dp_10"
 android:layout_height="60dp">
 <TextView
  android:background="#33fb1212"
  android:id="@+id/tv"
  tools:text="你好啊"
  android:gravity="center_vertical"
  android:textSize="17dp"
  android:paddingLeft="15dp"
  android:textColor="#333"
  android:layout_width="0dp"
  android:layout_weight="2"
  android:layout_height="match_parent" />
 <TextView
  android:background="#33fb1212"
  android:id="@+id/tv2"
  tools:text="0s"
  android:gravity="center_vertical"
  android:textSize="17dp"
  android:paddingLeft="15dp"
  android:textColor="#333"
  android:layout_width="0dp"
  android:layout_weight="1"
  android:layout_height="match_parent" />
</LinearLayout>

总结

到此这篇关于Android 实现列表倒计时功能的文章就介绍到这了,更多相关android 列表倒计时内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Android利用RecyclerView实现列表倒计时效果

    最近面试时,面试官问了一个列表倒计时效果如何实现,现在记录一下. 运行效果图 实现思路 实现方法主要有两个: 1.为每个开始倒计时的item启动一个定时器,再做更新item处理: 2.只启动一个定时器,然后遍历数据,再做再做更新item处理. 经过思考,包括性能.实现等方面,决定使用第2种方式实现. 实现过程 数据实体 /** * 总共的倒计时的时间(结束时间-开始时间),单位:毫秒 * 例: 2019-02-23 11:00:30 与 2019-02-23 11:00:00 之间的相差的毫秒数

  • Android 列表倒计时的实现的示例代码(CountDownTimer)

    实习一段时间了,一直想写点技术总结,但一直没找到合适的主题.刚好,最近版本中我负责的模块遇到了个线程相关问题(之前一直画界面,做点基础功能,有点乏味),列表项倒计时的实现. 于是乎,我的第一篇android技术文章就诞生了. [醒目]该demo用Kotlin语言实现. 背景介绍 需要在ListView的item里实现倒计时,初看还挺简单的,但是真正做的时候也遇到了不少坑. 网上有不少类似文章,有用对TextView扩展实现的,也有用自带的CountDownTimer实现的,本文就是用CountD

  • Android如何利用RecyclerView实现列表倒计时效果实例代码

    前言 最近面试时,面试官问了一个列表倒计时效果如何实现,然后脑袋突然懵的了O(∩_∩)O,现在记录一下. 运行效果图 实现思路 实现方法主要有两个: 1.为每个开始倒计时的item启动一个定时器,再做更新item处理: 2.只启动一个定时器,然后遍历数据,再做再做更新item处理. 经过思考,包括性能.实现等方面,决定使用第2种方式实现. 实现过程 数据实体 /** * 总共的倒计时的时间(结束时间-开始时间),单位:毫秒 * 例: 2019-02-23 11:00:30 与 2019-02-2

  • Android RecyclerView实现拼团倒计时列表实例代码

    前言 最近一直被需求赶着走,有些功能经过测试上线后就没再review.闲下来还是重新优化下老代码,温故而知新,还是有点收获和进步的 需求TODO 团购这种促销方式已经很普遍,尤其是大家熟悉的"并夕夕"更是玩的很6.现在我们就要实现一个团购倒计时列表,并以"剩余:09:12:24.8"这种样式来展示该团距离结束时间的倒计时. 技术初步分析 首先,有关时间变化的,首先想到TimerTask+Timer这个定时器组合,列表不用多说RecyclerView.其中涉及到UI更

  • Android ListView列表实现倒计时

    本文实例为大家分享了Android ListView列表实现倒计时的具体代码,供大家参考,具体内容如下 效果图: 1. Activity package com.s296267833.ybs.activity.firstPage.timedown; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.widget.ListView; import com.s296267

  • Android 实现列表倒计时功能

    单个计时器,然后遍历数据 刷新条目: 两种实现方式:1.Handler轮询: 2.子线程睡眠(时间到后 移除列表中的条目会有问题): 代码很简单,没有任何难度,列表使用 RecyclerView+BaseRecyclerViewAdapterHelper实现: implementation 'androidx.recyclerview:recyclerview:1.1.0' implementation 'com.github.CymChad:BaseRecyclerViewAdapterHel

  • Android实现时间倒计时功能

    本文实例为大家分享了Android实现时间倒计时功能展示的具体代码,供大家参考,具体内容如下 效果展示 MainActivity(主页面代码) public class MainActivity extends Activity { private RelativeLayout countDown; // 倒计时 private TextView daysTv, hoursTv, minutesTv, secondsTv; private long mDay = 10; private long

  • Android 简单实现倒计时功能

    在 Android 中倒计时功能是比较常用的一个功能,比如短信验证码,付款倒计时等.实现方式有Handler.Thread 等,但是实现起来都有点麻烦,其实Android已经为我们封装好了一个抽象类 CountDownTimer,可以简单的实现倒计时功能,如下图所示. CountDownTimer 实现倒计时功能的机制也是用Handler 消息控制,只是它帮我们已经封装好了,先看一下它的介绍. Schedule a countdown until a time in the future, wi

  • Android 实现抢购倒计时功能的示例

    一.效果图 二.思路 算多少秒,秒数取余60,(满足分后剩下的秒数) 算多少分,秒数除60,再取余60 (总分数满足小时后剩下的分数) 算多少时,秒数除60,除60,再取余24 (总小时满足天后剩下的小时) 算多少天,秒数除60,除60,除24 等到的整数就是天数 三.实现步骤: 我们这里的时间格式为后台返回,格式为: 2021-12-24 00:00:00 1.时间转换的工具类 //将年-月-天 时:分:秒转化为毫秒格式 public static long residueTimeout(St

  • 基于Android实现答题倒计时功能

    讲一下我在做一个答题APP时涉及到倒计时时遇到的一个问题吧. 碎片(Fragment)+CountDownTimer组成的一个答题,其中遇到的一个问题就是,这个题的倒计时在你手动滑动下一个题的时候却用在了下一个题的时间 解决这个问题运用的就是懒加载来控制倒计时的开始和取消 首先你要先定义一个抽象类继承Fragment 再让你的答题那个碎片的Activity继承 package com.zking.sun.dao; import android.support.v4.app.Fragment; i

  • 小程序实现列表倒计时功能

    本文实例为大家分享了小程序实现列表倒计时的具体代码,供大家参考,具体内容如下 效果 HTML代码 <view class="hbMpBox" wx:for="{{mpThing}}" data-goodsId="{{item.goods_id}}" data-id="{{index}}" bindtap="navSeceGroup"> <view class="hbMpBox_l

  • android实现条目倒计时功能

    网上对于这样的功能已经是泛滥成河了,但是最近遇到这样的一个需求,还是要值得我们学习一下,并将他记录下来. 布局文件: <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:

  • Android开屏页倒计时功能实现的详细教程

    最近我司产品提出了一个很常见的需求:App 在开屏页(Splash 界面) 需要加上一个 3s 倒计时按钮,可以选择看 3s 的广告,或者点击按钮跳过广告. 一.布局实现(使用 FrameLayout 悬浮在广告的右上角,显示倒计时的 TextView 的宽高尽量不要写死,要考虑字体很多的情况!!) <FrameLayout android:id="@+id/start_skip" android:layout_width="wrap_content" and

  • Android实现订单倒计时功能

    先上效果图 1.activity_main.xml <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+

  • Android实现获取验证码倒计时功能

    本文实例为大家分享了android获取验证码倒计时功能的具体代码,供大家参考,具体内容如下 获取验证码倒计时在现在的App中非常常见,他主要的功能点就是给TextView设置一个点击事件,但是当点击后或出现倒计时,在倒计时的时候点击是触发不了点击事件的. 等倒计时结束显示重新获取验证码的时候可以重新触发点击事件: 在真实的项目中一般都是设置一分钟,咱们这里就不设置那么长了,设置10秒: 首先说下我这个demo非常简单,工具类不用管,直接复制到项目中,只需要两步两行代码即可: 第一步:初始化工具类

随机推荐