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

  

  

最近面试时,面试官问了一个列表倒计时效果如何实现,然后脑袋突然懵的了O (∩_∩) O,现在记录一下。

  


  

  

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

  


  

  

实现方法主要有两个:
  

  

1。为每个开始倒计时的项目启动一个定时器,再做更新项目处理;
  

  

2。只启动一个定时器,然后遍历数据,再做再做更新项目处理。
  

  

经过思考,包括性能,实现等方面,决定使用第2种方式实现。

  

  

数据实体
  

     /* *   *总共的倒计时的时间(结束时间,开始时间),单位:毫秒   *例:2019-02-23 11:00:30与2019-02-23 11:00:00之间的相差的毫秒数   */私人长totalTime;/* *   *倒计时是否在暂停状态   */私人布尔isPause=true;之前      

倒计时
  

  

计时器
  

        mTimer。日程安排(mTask 0 1000);      TimerTask

        类MyTask延伸TimerTask {   @Override   公共空间run () {   如果(mList.isEmpty ()) {   返回;   }   int大?mList.size ();   CountDownTimerBean豆;   长totalTime;   for (int i=0;我& lt;大小;我+ +){   bean=mList.get(我);   如果(! bean.isPause()){//不处于暂停状态   totalTime=bean.getTotalTime () - 1000;   如果(totalTime & lt;=0) {   bean.setPause(真正的);   bean.setTotalTime (0);   }   bean.setTotalTime (totalTime);   消息消息=mHandler.obtainMessage (1);   消息。__arg1=我;   mHandler.sendMessage(消息);   }   }   }   }      

线程交互更新项目
  

        mHandler=新处理程序(Looper.getMainLooper ()) {   @Override   公共空间handleMessage(消息味精){   开关(msg.what) {   案例1:   notifyItemChanged(味精。__arg1、“修改时间”);   打破;   }   }   };      

性能优化方面
  

  

1。调用notifyItemChanged()方法后,不要更新整个条目(比如说物品包含图片,不需要变的),所以要重写onBindViewHolder (int,持有人列表
  

        @Override   公共空间>/* *   *销毁资源   */公共空间摧毁(){   mHandler.removeMessages (1);   如果(mTimer !=null) {   mTimer.cancel ();   mTimer.purge ();   mTimer=零;   }   }      

RecyclerView。适配器部分源码
  

        公开课CountDownTimerAdapter延伸RecyclerView.Adapter{   私有静态最终字符串标签=癈ountDownTimerAdapter→”;   私人ListmList;//数据   私人处理器mHandler;//线程调度,用来更新列的表      私人计时器mTimer;   私人MyTask mTask;      公共CountDownTimerAdapter () {   ,mList=new ArrayList<的在();   mHandler=新处理程序(Looper.getMainLooper ()) {   @Override   公共空间handleMessage(消息味精){   开关(msg.what) {   案例1:   notifyItemChanged(味精。__arg1、“修改时间”);   打破;   }   }   };   mTask=new MyTask ();   }      公共空间bindAdapterToRecyclerView (@NonNull RecyclerView视图){   view.setAdapter(这个);   }/* *   *设置新的数据源   *   * @param列表数据   */公共空间setNewData (@NonNull List列表){   destroy ();   mList.clear ();   mList.addAll(列表);   notifyDataSetChanged ();   如果(mTimer==null) {   mTimer=new计时器();   }   mTimer。日程安排(mTask 0 1000);   }/* *   *销毁资源   */公共空间摧毁(){   mHandler.removeMessages (1);   如果(mTimer !=null) {   mTimer.cancel ();   mTimer.purge ();   mTimer=零;   }   }      @NonNull   @Override   公共持有人onCreateViewHolder (@NonNull ViewGroup ViewGroup, int i) {   视图视图=LayoutInflater.from (viewGroup.getContext ()) .inflate (R.layout.item_count_down_timer viewGroup,假);   返回新持有人(查看);   }      @Override   公共空间onBindViewHolder (@NonNull持有人持有人,int位置,@NonNull List有效载荷){   如果(payloads.isEmpty ()) {   onBindViewHolder(支架、位置);   返回;   }//更新某个控件,比如说只需要更新时间信息,其他不用动   CountDownTimerBean bean=mList.get(位置);   漫长的一天=bean.getTotalTime ()/(1000 * 60 * 60 * 24);   长时间=(bean.getTotalTime()/(1000 * 60 * 60)天* 24);   长最小值=((bean.getTotalTime()/(60 * 1000))天* 24 * 60 * 60小时);   长s=(bean.getTotalTime()/1000天* 24 * 60 * 60小时* 60 * 60 - min * 60);   holder.tvTime。setText(“剩余时间:“+天+“天”+小时+“小”时+分钟+ + s“分”+“秒”);   holder.btnAction.setText (bean.isPause () & # 63;“开始”:“暂停”);   holder.btnAction.setEnabled (bean.getTotalTime () !=0);   }      @Override   公共空间onBindViewHolder (@NonNull最终持有人持有人,int位置){   holder.ivIcon.setImageResource (R.mipmap.ic_launcher_round);   最后CountDownTimerBean bean=mList.get(位置);   漫长的一天=bean.getTotalTime ()/(1000 * 60 * 60 * 24);   长时间=(bean.getTotalTime()/(1000 * 60 * 60)天* 24);   长最小值=((bean.getTotalTime()/(60 * 1000))天* 24 * 60 * 60小时);   长s=(bean.getTotalTime()/1000天* 24 * 60 * 60小时* 60 * 60 - min * 60);   holder.tvTime。setText(“剩余时间:“+天+“天”+小时+“小”时+分钟+ + s“分”+“秒”);   holder.btnAction.setText (bean.isPause () & # 63;“开始”:“暂停”);   holder.btnAction.setEnabled (bean.getTotalTime () !=0);   holder.btnAction。setOnClickListener(新View.OnClickListener () {   @Override   公共空间onClick(查看v) {   如果(bean.isPause ()) {   bean.setPause(假);   holder.btnAction.setText(“暂停”);   其他}{   bean.setPause(真正的);   holder.btnAction.setText(“开始”);   }   }   });   }      @Override   公共int getItemCount () {   返回mList.size ();   }      类持有人RecyclerView延伸。ViewHolder {   私人ImageView ivIcon;   私人TextView tvTime;   私人按钮btnAction;      持有人(@NonNull视图itemView) {   超级(itemView);   ivIcon=itemView.findViewById (R.id.iv_icon);   tvTime=itemView.findViewById (R.id.tv_time);   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null

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

Copyright © 2020-2023 feiqueyun.cn. All Rights Reserved. 肥雀云_南京肥雀信息技术有限公司版权所有 南京肥雀信息技术有限公司 苏ICP备16063723号-5