热门标签 | HotTags
当前位置:  开发笔记 > Android > 正文

android实现条目倒计时功能

这篇文章主要为大家详细介绍了android实现条目倒计时功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

网上对于这样的功能已经是泛滥成河了,但是最近遇到这样的一个需求,还是要值得我们学习一下,并将他记录下来。

布局文件:


Activity界面:

public class ListCountDownActivity extends AppCompatActivity {

 RecyclerView mRecyclerView;

 @Override
 protected void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 setContentView(R.layout.activity_list_count_down);
 initView();

 }

 private void initView() {
 mRecyclerView = (RecyclerView) findViewById(R.id.rv_list_count_down);
 mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
 CountDownAdapter adapter = new CountDownAdapter();
 mRecyclerView.setAdapter(adapter);
 List list = new ArrayList<>();
 for (int i = 1; i <101; i++) {
  list.add(new DataInfo("我是条目" + i, i * 100));
 }
 adapter.setmDatas(list);
 }
}

倒计时条目适配器:

/**
 * @Date 2018/4/26
 * @Introduction 倒计时条目适配器
 */

public class CountDownAdapter extends RecyclerView.Adapter {

 private final String TAG = CountDownAdapter.class.getSimpleName();

 private final int STOP = 0x01;
 private final int START = 0x02;
 private final int LOOP = 0x03;

 private List mDatas;

 public CountDownAdapter() {
 }

 public void setmDatas(List mDatas) {
 this.mDatas = mDatas;
 notifyDataSetChanged();
 }

 @Override
 public MyViewHoder onCreateViewHolder(ViewGroup parent, int viewType) {
 return new MyViewHoder(LayoutInflater.from(parent.getContext()).inflate(R.layout.item_count_down, parent, false));
 }

 @Override
 public void onBindViewHolder(final MyViewHoder holder, int position) {
 final DataInfo info = mDatas.get(position);
 holder.tvName.setText(info.getName());
 holder.tvTime.setText(info.getTime() + "");
 if (info.isCountDown()) {
  holder.btnStart.setText("停止");
 } else {
  holder.btnStart.setText("开始");
 }
 holder.btnStart.setOnClickListener(new View.OnClickListener() {
  @Override
  public void onClick(View view) {
  Message msg = Message.obtain();
  if (!info.isCountDown()) {
   holder.btnStart.setText("停止");
   msg.what = START;
  } else {
   holder.btnStart.setText("开始");
   msg.what = STOP;
  }
  msg.obj = info;
  mHandler.sendMessage(msg);
  info.setCountDown(!info.isCountDown());
  }
 });
 }

 @Override
 public int getItemCount() {
 return mDatas == null &#63; 0 : mDatas.size();
 }

 static class MyViewHoder extends RecyclerView.ViewHolder {

 private final TextView tvName;
 private final TextView tvTime;
 private final Button btnStart;

 public MyViewHoder(View itemView) {
  super(itemView);
  tvName = (TextView) itemView.findViewById(R.id.tv_name_count_down_item);
  tvTime = (TextView) itemView.findViewById(R.id.tv_time_count_down_item);
  btnStart = (Button) itemView.findViewById(R.id.btn_time_count_down_item);
 }
 }

 private Handler mHandler = new Handler() {

 private List mCountDownList = new ArrayList<>();

 @Override
 public void handleMessage(Message msg) {
  setChange(msg);
 }

 private synchronized void setChange(Message msg) {
  switch (msg.what) {
  case STOP:
   DataInfo stopInfo = (DataInfo) msg.obj;
   Log.e(TAG, "------------stop:" + stopInfo.getName());
   mCountDownList.remove(stopInfo);
   notifyDataSetChanged();
   if (mCountDownList.size() <= 0) {
   mHandler.removeCallbacksAndMessages(null);
   }
   break;
  case START:
   DataInfo startInfo = (DataInfo) msg.obj;
   Log.e(TAG, "------------start:" + startInfo.getName());
   if (startInfo.getTime() > 0) {
   mCountDownList.add(startInfo);
   mHandler.sendEmptyMessageDelayed(LOOP, 1000);
   }
   break;
  case LOOP:
   if (mCountDownList.size() <= 0) {
   return;
   }
   for (Iterator iterator = mCountDownList.iterator(); iterator.hasNext(); ) {
   DataInfo dataInfo = iterator.next();
   int time = dataInfo.getTime();
   time--;
   dataInfo.setTime(time);
   if (time <= 0) {
    iterator.remove();
   }
   }
   notifyDataSetChanged();
   mHandler.removeCallbacksAndMessages(null);
   mHandler.sendEmptyMessageDelayed(LOOP, 1000);
   break;
  default:
   break;
  }
 }
 };
}

JavaBean类

/**
 * @Date 2018/4/26
 * @Introduction 倒计时数据实体类
 */

public class DataInfo {
 private String name;
 private int time;
 private boolean isCountDown = false;

 public DataInfo(String name, int time) {
 this.name = name;
 this.time = time;
 }

 public String getName() {
 return name;
 }

 public void setName(String name) {
 this.name = name;
 }

 public int getTime() {
 return time;
 }

 public void setTime(int time) {
 this.time = time;
 }

 public boolean isCountDown() {
 return isCountDown;
 }

 public void setCountDown(boolean countDown) {
 isCountDown = countDown;
 }
}

以上就是条目中倒计时的一个小Demo。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


推荐阅读
  • 如何高效学习鸿蒙操作系统:开发者指南
    本文探讨了开发者如何更有效地学习鸿蒙操作系统,提供了来自行业专家的建议,包括系统化学习方法、职业规划建议以及具体的开发技巧。 ... [详细]
  • Maven快照版本管理及更新策略详解
    本文深入探讨了Maven中的快照版本管理和更新策略,解释了快照版本与正式版本的区别,并提供了如何配置快照更新策略的方法,以确保项目依赖始终保持最新。 ... [详细]
  • 本文介绍了用户界面(User Interface, UI)的基本概念,以及在iOS应用程序中UIView及其子类的重要性和使用方式。文章详细探讨了UIView如何作为用户交互的核心组件,以及它与其他UI控件和业务逻辑的关系。 ... [详细]
  • 实现Win10与Linux服务器的SSH无密码登录
    本文介绍了如何在Windows 10环境下使用Git工具,通过配置SSH密钥对,实现与Linux服务器的无密码登录。主要步骤包括生成本地公钥、上传至服务器以及配置服务器端的信任关系。 ... [详细]
  • Gradle 是 Android Studio 中默认的构建工具,了解其基本配置对于开发效率的提升至关重要。本文将详细介绍如何在 Gradle 中定义和使用共享变量,以确保项目的一致性和可维护性。 ... [详细]
  • 本文由chszs撰写,详细介绍了Apache Mina框架的核心开发流程及自定义协议处理方法。文章涵盖从创建IoService实例到协议编解码的具体步骤,适合希望深入了解Mina框架应用的开发者。 ... [详细]
  • 本文详细介绍了如何配置Flutter开发环境,包括下载和解压Flutter SDK,设置环境变量,安装必要的Android工具和插件,以及启动模拟器进行测试。 ... [详细]
  • 本文提供了一个关于AC自动机(Aho-Corasick Algorithm)的详细解析与实现方法,特别针对P3796题目进行了深入探讨。文章不仅涵盖了AC自动机的基本概念,还重点讲解了如何通过构建失败指针(fail pointer)来提高字符串匹配效率。 ... [详细]
  • 本报告记录了嵌入式软件设计课程中的第二次实验,主要探讨了使用KEIL V5开发环境和ST固件库进行GPIO控制及按键响应编程的方法。通过实际操作,加深了对嵌入式系统硬件接口编程的理解。 ... [详细]
  • 本文探讨了当尝试通过单击事件多次启动同一线程时,如何避免遇到java.lang.IllegalThreadStateException: Thread already started异常,并提供了两种有效的解决方案。 ... [详细]
  • LeetCode 102 - 二叉树层次遍历详解
    本文详细解析了LeetCode第102题——二叉树的层次遍历问题,提供了C++语言的实现代码,并对算法的核心思想和具体步骤进行了深入讲解。 ... [详细]
  • JavaScript 中引号的多层嵌套使用技巧
    本文详细介绍了在 JavaScript 编程中如何处理引号的多级嵌套问题,包括双引号、单引号以及转义字符的正确使用方法。 ... [详细]
  • 解决UIScrollView自动偏移问题的方法
    本文介绍了一种有效的方法来解决在使用UIScrollView时出现的自动向下偏移的问题,通过调整特定的属性设置,可以确保滚动视图正常显示。 ... [详细]
  • 如何高效渲染JSON数据
    本文介绍了在控制器中返回JSON结果的方法,并详细说明了如何利用jQuery处理和展示这些数据,为Web开发提供了实用的技巧。 ... [详细]
  • Awk是一款功能强大的文本分析与处理工具,尤其在数据解析和报告生成方面表现突出。它通过读取由换行符分隔的记录,并按照指定的字段分隔符来划分和处理这些记录,从而实现复杂的数据操作。 ... [详细]
author-avatar
广交天下友V笑
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有