利用RecyclerView实现一个非常简单的列表倒计时


一、先上效果图

二、GitHub

代码地址,欢迎指正https://github.com/MNXP/Countdown

三、思路

 在adapter中设置timer倒计时,然后利用RecyclerView更新单个item特性实现
复制代码

四、实现

1)变量

 useTime倒计时时间timeFlag用来判断是否有倒计时,倒计时结束更新UI
复制代码

2)倒计时

遍历list,设置时间useTime-1000,然后判断时间和timeFlag更新显示
复制代码
   private void startTime() {new Timer().schedule(new TimerTask() {@Overridepublic void run() {((Activity) mContext).runOnUiThread(new Runnable() {@Overridepublic void run() {for (int i = 0; i < mTimeDownBeanList.size(); i++) {long useTime = mTimeDownBeanList.get(i).getUseTime();if (useTime > 1000) {useTime -= 1000;mTimeDownBeanList.get(i).setUseTime(useTime);if (useTime <= 1000 && mTimeDownBeanList.get(i).isTimeFlag()) {mTimeDownBeanList.get(i).setTimeFlag(false);CountDownAdapter.this.notifyItemChanged(i);}else {mTimeDownBeanList.get(i).setTimeFlag(true);CountDownAdapter.this.notifyItemChanged(i);}}}}});}}, 0, 1000);}
复制代码

3)常规操作(设置倒计时时间)

  private void setTime(ViewHolder holder, int position) throws ParseException{TimeDownBean timeDownBean = mTimeDownBeanList.get(position);if (timeDownBean.getUseTime() > 1000) {holder.timeTv.setVisibility(View.VISIBLE);long useTime = timeDownBean.getUseTime();useTime = useTime / 1000;setTimeShow(useTime, holder);}else {holder.timeTv.setVisibility(View.GONE);}}private void setTimeShow(long useTime, ViewHolder holder) {int hour = (int) (useTime / 3600 );int min = (int) (useTime / 60 % 60);int second = (int) (useTime % 60);int day = (int) (useTime / 3600 / 24);String mDay, mHour, mMin, mSecond;//天,小时,分钟,秒second--;if (second < 0) {min--;second = 59;if (min < 0) {min = 59;hour--;}}if (hour < 10) {mHour = "0" + hour;} else {mHour = "" + hour;}if (min < 10) {mMin = "0" + min;} else {mMin = "" + min;}if (second < 10) {mSecond = "0" + second;} else {mSecond = "" + second;}String strTime = "上架倒计时 " +mHour + ":" + mMin + ":" + mSecond + "";holder.timeTv.setText(strTime);}
复制代码

4)注意

防止更新item时防止抖动
((SimpleItemAnimator) mRecycleListView.getItemAnimator()).setSupportsChangeAnimations(false);
复制代码

5)Adapter完整代码

public class CountDownAdapter extends RecyclerView.Adapter {private Context mContext;private List<TimeDownBean> mTimeDownBeanList;public CountDownAdapter(Context context,List<TimeDownBean> mTimeDownBeanList){this.mContext = context;this.mTimeDownBeanList = mTimeDownBeanList;startTime();}/*** 列表倒计时*/private void startTime() {new Timer().schedule(new TimerTask() {@Overridepublic void run() {((Activity) mContext).runOnUiThread(new Runnable() {@Overridepublic void run() {for (int i = 0; i < mTimeDownBeanList.size(); i++) {long useTime = mTimeDownBeanList.get(i).getUseTime();if (useTime > 1000) {useTime -= 1000;mTimeDownBeanList.get(i).setUseTime(useTime);if (useTime <= 1000 && mTimeDownBeanList.get(i).isTimeFlag()) {mTimeDownBeanList.get(i).setTimeFlag(false);CountDownAdapter.this.notifyItemChanged(i);}else {mTimeDownBeanList.get(i).setTimeFlag(true);CountDownAdapter.this.notifyItemChanged(i);}}}}});}}, 0, 1000);}@Overridepublic RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {View view = View.inflate(mContext,R.layout.count_down_item,null);return new ViewHolder(view);}@Overridepublic void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {if (holder instanceof ViewHolder){ViewHolder viewHolder = (ViewHolder) holder;TimeDownBean timeDownBean = mTimeDownBeanList.get(position);viewHolder.contentTv.setText(timeDownBean.getContent());try {setTime(viewHolder, position);} catch (ParseException e) {e.printStackTrace();}}}private void setTime(ViewHolder holder, int position) throws ParseException{TimeDownBean timeDownBean = mTimeDownBeanList.get(position);if (timeDownBean.getUseTime() > 1000) {holder.timeTv.setVisibility(View.VISIBLE);long useTime = timeDownBean.getUseTime();useTime = useTime / 1000;setTimeShow(useTime, holder);}else {holder.timeTv.setVisibility(View.GONE);}}private void setTimeShow(long useTime, ViewHolder holder) {int hour = (int) (useTime / 3600 );int min = (int) (useTime / 60 % 60);int second = (int) (useTime % 60);int day = (int) (useTime / 3600 / 24);String mDay, mHour, mMin, mSecond;//天,小时,分钟,秒second--;if (second < 0) {min--;second = 59;if (min < 0) {min = 59;hour--;}}if (hour < 10) {mHour = "0" + hour;} else {mHour = "" + hour;}if (min < 10) {mMin = "0" + min;} else {mMin = "" + min;}if (second < 10) {mSecond = "0" + second;} else {mSecond = "" + second;}String strTime = "上架倒计时 " +mHour + ":" + mMin + ":" + mSecond + "";holder.timeTv.setText(strTime);}@Overridepublic int getItemCount() {return mTimeDownBeanList!=null?mTimeDownBeanList.size():0;}private class ViewHolder extends RecyclerView.ViewHolder{private TextView contentTv;private TextView timeTv;private ViewHolder(View itemView) {super(itemView);init(itemView);itemView.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {if (itemClickListener!=null){itemClickListener.onItemClick(v,getLayoutPosition());}}});}private void init(View itemView) {contentTv = (TextView)itemView.findViewById(R.id.content_tv);timeTv = (TextView)itemView.findViewById(R.id.time_tv);}}//对外部暴漏点击事件接口public interface OnItemClickListener{void onItemClick(View v,int position);}public OnItemClickListener itemClickListener;public void setItemClickListener(OnItemClickListener itemClickListener) {this.itemClickListener = itemClickListener;}
}复制代码

如有意见和建议,及时沟通。

转载于:https://juejin.im/post/5ab22c81f265da239f074264

Android利用RecyclerView实现列表倒计时相关推荐

  1. android 列表倒计时,Android利用RecyclerView实现列表倒计时效果

    最近面试时,面试官问了一个列表倒计时效果如何实现,现在记录一下. 运行效果图 实现思路 实现方法主要有两个: 1.为每个开始倒计时的item启动一个定时器,再做更新item处理: 2.只启动一个定时器 ...

  2. android电脑文件列表不刷新,Android 利用RecyclerView.Adapter刷新列表中的单个view问题...

    首先使用RecyclerView的adapter继承:RecyclerView.Adapter public class OrderListAdapter extends RecyclerView.A ...

  3. android列表实现置顶,Android利用RecyclerView实现全选、置顶和拖拽功能示例

    Android利用RecyclerView实现全选.置顶和拖拽功能示例 发布时间:2020-08-23 16:26:42 来源:脚本之家 阅读:159 作者:爱开发 前言 今天给大家分享是如何在Rec ...

  4. android开发 RecyclerView 瀑布列表布局

    android开发 RecyclerView 瀑布列表布局 1.写一个内容的自定义小布局: <?xml version="1.0" encoding="utf-8& ...

  5. android开发实现选择列表,Android使用RecyclerView实现列表数据选择操作

    Android使用RecyclerView实现列表数据选择操作 发布时间:2020-08-31 17:50:13 来源:脚本之家 阅读:76 作者:迟做总比不做强 这些时间做安卓盒子项目,因为安卓电视 ...

  6. android列表倒计时,RecyclerView实现列表倒计时

    最近在做一个项目,需要用到列表倒计时功能,捣鼓半天终于弄了出来,在安卓中实现这个效果需要用到Countdowntimer,通过这个类的使用,不仅可以实现倒计时的效果,还可以完美解决在实现倒计时过程中的 ...

  7. Android实现RecyclerView二级列表可折叠展开选中

    前言 项目里需要实现个可折叠,可展开的的二级列表,首先想到了用ExpandListView去实现,ExpandListView是继承ListView的.由于项目里所有列表都用Recycleview,再 ...

  8. android 当前置顶的控件,Android利用RecyclerView实现全选、置顶和拖拽功能示例

    前言 今天给大家分享是如何在RecyclerView实现全选,ItemTouchHelper实现侧滑删除,拖拽功能.比较基础.关于RecyclerView的强大,就不多说了.在Android L SD ...

  9. android 一分钟倒计时动画,Android利用属性动画自定义倒计时控件

    本文介绍一下利用属性动画(未使用Timer,通过动画执行次数控制倒计时)自定义一个圆形倒计时控件,比较简陋,仅做示例使用,如有需要,您可自行修改以满足您的需求.控件中所使用的素材及配色均是笔者随意选择 ...

最新文章

  1. 基于OpenCV的网络实时视频流传输
  2. 国内5G工程建设面临的6大挑战
  3. linux中的rm 删除命令
  4. 计算机网络管理考试价格,2021年计算机网络管理员考试模拟试题库和答案...doc...
  5. vc2010多线程使用std标准模板库容器DEBUG版迭代器BUG
  6. Win32 串口编程(一)
  7. java进阶案例下载_java进阶案例
  8. 基于 Roslyn 实现动态编译
  9. 图解+笔记-4.2.1 字符串获取操作、字符串合并和重复操作
  10. CTO 说了,如果发现谁用 SELECT * 查询直接开除
  11. 获取到的数组在webview中成了字符串
  12. Linux段管理,BSS段,data段,.rodata段,text段
  13. linux shell并发执行命令
  14. C++五子棋人机对战
  15. Android音视频【五】H265/HEVC码流结构
  16. 大一第一学期c语言考试题及答案,大一c语言试题及答案.doc
  17. 第四届中国区块链开发大赛初评公布 超级链战队多个作品进入复赛
  18. lingo入门——从河北省第三届研究生建模竞赛B题开始
  19. 在线文件管理html,KODExplorer可道云-开源Web在线文件管理系统
  20. 迅雷欲缔造互联网“视频梦工厂”

热门文章

  1. 20天持续压测,告诉你云存储性能哪家更强?
  2. linux运维人员必会运维工具
  3. ubuntu15.04 TLS
  4. QTP11补丁下载 – 完美支持FIREFOX 9~10
  5. AgileEAS.NET平台开发实例-药店系统-报表开发(上)
  6. Ubuntu 16.04 安装 CUDA、CUDNN 和 GPU 版本的 TensorFlow 一般步骤总结
  7. 两句话动态修改table数据并提交到后台
  8. 新手搭建阿里云FTP服务器
  9. c 高级函数的简单用法
  10. 安装python-devel开发包