Android 实现列表倒计时功能

 更新时间:2020年03月19日 21:02:05   作者:Choi晨  
这篇文章主要介绍了Android 实现列表倒计时功能,代码很简单,没有任何难度,使用RecyclerView+BaseRecyclerViewAdapterHelper列表实现,需要的朋友可以参考下

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

两种实现方式: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 列表倒计时内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Android利用手势完成屏幕密码锁功能

    Android利用手势完成屏幕密码锁功能

    这篇文章主要为大家详细介绍了Android利用手势完成屏幕密码锁功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-03-03
  • Android实现EditText添加下划线

    Android实现EditText添加下划线

    这篇文章主要为大家详细介绍了Android如何实现给EditText添加下划线,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-08-08
  • 利用SpannableString和ImageSpan在textview中插入图片的方法

    利用SpannableString和ImageSpan在textview中插入图片的方法

    这篇文章主要为大家详细介绍了利用SpannableString和ImageSpan在textview中插入图片的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-11-11
  • APK包名修改 请问如何修改APK包名

    APK包名修改 请问如何修改APK包名

    今天,想在android手机上安装两个相同的应用,本以为可以安装不同版本的,试了几次,均相互覆盖了,于是,只能设法修改apk所对应的包名(package name),需要了解的朋友可以参考下
    2012-12-12
  • 浅析Android高斯模糊实现方案

    浅析Android高斯模糊实现方案

    这篇文章给大家介绍了Android高斯模糊实现方案,本文通过场景分析代码讲解的非常详细,需要的朋友参考下吧
    2019-10-10
  • 深入AndroidManifest.xml文件解析详解

    深入AndroidManifest.xml文件解析详解

    AndroidManifest.xml是每个android程序中必须的文件。它位于整个项目的根目录,描述了package中暴露的组件(activities,services,等等),他们各自的实现类,各种能被处理的数据和启动位置
    2013-05-05
  • Android中注解处理器APT用法示例

    Android中注解处理器APT用法示例

    APT全称Annotation Processing Tool,即注解处理器,APT是一种处理注释的工具, 它对源代码文件进行检测找出其中的注解,并使用注解进行额外的处理,给我们自动生成代码,简化使用,很多流行框架都使用到了APT技术,如 ButterKnife,Retrofit,Arouter,EventBus 等等
    2023-12-12
  • Android Flutter实现GIF动画效果的方法详解

    Android Flutter实现GIF动画效果的方法详解

    如果我们想对某个组件实现一组动效应该怎么办呢?本文将利用Android Flutter实现GIF动画效果,文中的示例代码讲解详细,需要的可以参考一下
    2022-06-06
  • Win10下Android App安装配置开发环境

    Win10下Android App安装配置开发环境

    这篇文章主要为大家详细介绍了Win10下Android App安装配置开发环境,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-07-07
  • android studio 3.6.1升级后如何处理 flutter问题

    android studio 3.6.1升级后如何处理 flutter问题

    这篇文章主要介绍了android-studio-3.6.1升级后 flutter问题,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-03-03

最新评论