亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > Android > 正文

Android如何利用RecyclerView實現列表倒計時效果實例代碼

2019-10-21 21:25:06
字體:
來源:轉載
供稿:網友

前言

最近面試時,面試官問了一個列表倒計時效果如何實現,然后腦袋突然懵的了O(∩_∩)O,現在記錄一下。

運行效果圖

Android,RecyclerView,倒計時,代碼

實現思路

實現方法主要有兩個:

1.為每個開始倒計時的item啟動一個定時器,再做更新item處理;

2.只啟動一個定時器,然后遍歷數據,再做再做更新item處理。

經過思考,包括性能、實現等方面,決定使用第2種方式實現。

實現過程

數據實體

/**  * 總共的倒計時的時間(結束時間-開始時間),單位:毫秒  * 例: 2019-02-23 11:00:30 與 2019-02-23 11:00:00 之間的相差的毫秒數  */  private long totalTime;  /**  * 倒計時是否在暫停狀態  */  private boolean isPause = true; 

倒計時

Timer

mTimer.schedule(mTask, 0, 1000);

TimerTask

 class MyTask extends TimerTask {  @Override  public void run() {   if (mList.isEmpty()) {    return;   }   int size = mList.size();   CountDownTimerBean bean;   long totalTime;   for (int i = 0; i < size; i++) {    bean = mList.get(i);    if (!bean.isPause()) {//不處于暫停狀態     totalTime = bean.getTotalTime() - 1000;     if (totalTime <= 0) {      bean.setPause(true);      bean.setTotalTime(0);     }     bean.setTotalTime(totalTime);     Message message = mHandler.obtainMessage(1);     message.arg1 = i;     mHandler.sendMessage(message);    }   }  } }

線程交互更新item

 mHandler = new Handler(Looper.getMainLooper()) {   @Override   public void handleMessage(Message msg) {    switch (msg.what) {     case 1:      notifyItemChanged(msg.arg1, "update-time");      break;    }   }  };

性能優化方面

1.調用notifyItemChanged()方法后,不要更新整個item(比如說item包含圖片,不需要變的),所以要重寫onBindViewHolder( Holder , int , List

@Override public void onBindViewHolder(@NonNull Holder holder, int position, @NonNull List<Object> payloads) {  if (payloads.isEmpty()) {   onBindViewHolder(holder, position);   return;  }  //更新某個控件,比如說只需要更新時間信息,其他不用動  CountDownTimerBean bean = mList.get(position);  long day = bean.getTotalTime() / (1000 * 60 * 60 * 24);  long hour = (bean.getTotalTime() / (1000 * 60 * 60) - day * 24);  long min = ((bean.getTotalTime() / (60 * 1000)) - day * 24 * 60 - hour * 60);  long s = (bean.getTotalTime() / 1000 - day * 24 * 60 * 60 - hour * 60 * 60 - min * 60);  holder.tvTime.setText("剩余時間: " + day + "天" + hour + "小時" + min + "分" + s + "秒");  holder.btnAction.setText(bean.isPause() ? "開始" : "暫停");  holder.btnAction.setEnabled(bean.getTotalTime() != 0); }

2.銷毀資源操作:

 /**  * 銷毀資源  */ public void destroy() {  mHandler.removeMessages(1);  if (mTimer != null) {   mTimer.cancel();   mTimer.purge();   mTimer = null;  } }

RecyclerView.Adapter部分源碼

public class CountDownTimerAdapter extends RecyclerView.Adapter<CountDownTimerAdapter.Holder> { private static final String TAG = "CountDownTimerAdapter->"; private List<CountDownTimerBean> mList;//數據 private Handler mHandler;//線程調度,用來更新列表 private Timer mTimer; private MyTask mTask; public CountDownTimerAdapter() {  mList = new ArrayList<>();  mHandler = new Handler(Looper.getMainLooper()) {   @Override   public void handleMessage(Message msg) {    switch (msg.what) {     case 1:      notifyItemChanged(msg.arg1, "update-time");      break;    }   }  };  mTask = new MyTask(); } public void bindAdapterToRecyclerView(@NonNull RecyclerView view) {  view.setAdapter(this); } /**  * 設置新的數據源  *  * @param list 數據  */ public void setNewData(@NonNull List<CountDownTimerBean> list) {  destroy();  mList.clear();  mList.addAll(list);  notifyDataSetChanged();  if (mTimer == null) {   mTimer = new Timer();  }  mTimer.schedule(mTask, 0, 1000); } /**  * 銷毀資源  */ public void destroy() {  mHandler.removeMessages(1);  if (mTimer != null) {   mTimer.cancel();   mTimer.purge();   mTimer = null;  } } @NonNull @Override public Holder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {  View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.item_count_down_timer, viewGroup, false);  return new Holder(view); } @Override public void onBindViewHolder(@NonNull Holder holder, int position, @NonNull List<Object> payloads) {  if (payloads.isEmpty()) {   onBindViewHolder(holder, position);   return;  }  //更新某個控件,比如說只需要更新時間信息,其他不用動  CountDownTimerBean bean = mList.get(position);  long day = bean.getTotalTime() / (1000 * 60 * 60 * 24);  long hour = (bean.getTotalTime() / (1000 * 60 * 60) - day * 24);  long min = ((bean.getTotalTime() / (60 * 1000)) - day * 24 * 60 - hour * 60);  long s = (bean.getTotalTime() / 1000 - day * 24 * 60 * 60 - hour * 60 * 60 - min * 60);  holder.tvTime.setText("剩余時間: " + day + "天" + hour + "小時" + min + "分" + s + "秒");  holder.btnAction.setText(bean.isPause() ? "開始" : "暫停");  holder.btnAction.setEnabled(bean.getTotalTime() != 0); } @Override public void onBindViewHolder(@NonNull final Holder holder, int position) {  holder.ivIcon.setImageResource(R.mipmap.ic_launcher_round);  final CountDownTimerBean bean = mList.get(position);  long day = bean.getTotalTime() / (1000 * 60 * 60 * 24);  long hour = (bean.getTotalTime() / (1000 * 60 * 60) - day * 24);  long min = ((bean.getTotalTime() / (60 * 1000)) - day * 24 * 60 - hour * 60);  long s = (bean.getTotalTime() / 1000 - day * 24 * 60 * 60 - hour * 60 * 60 - min * 60);  holder.tvTime.setText("剩余時間: " + day + "天" + hour + "小時" + min + "分" + s + "秒");  holder.btnAction.setText(bean.isPause() ? "開始" : "暫停");  holder.btnAction.setEnabled(bean.getTotalTime() != 0);  holder.btnAction.setOnClickListener(new View.OnClickListener() {   @Override   public void onClick(View v) {    if (bean.isPause()) {     bean.setPause(false);     holder.btnAction.setText("暫停");    } else {     bean.setPause(true);     holder.btnAction.setText("開始");    }   }  }); } @Override public int getItemCount() {  return mList.size(); } class Holder extends RecyclerView.ViewHolder {  private ImageView ivIcon;  private TextView tvTime;  private Button btnAction;  Holder(@NonNull View itemView) {   super(itemView);   ivIcon = itemView.findViewById(R.id.iv_icon);   tvTime = itemView.findViewById(R.id.tv_time);   btnAction = itemView.findViewById(R.id.btn_action);  } } class MyTask extends TimerTask {  @Override  public void run() {   if (mList.isEmpty()) {    return;   }   int size = mList.size();   CountDownTimerBean bean;   long totalTime;   for (int i = 0; i < size; i++) {    bean = mList.get(i);    if (!bean.isPause()) {//不處于暫停狀態     totalTime = bean.getTotalTime() - 1000;     if (totalTime <= 0) {      bean.setPause(true);      bean.setTotalTime(0);     }     bean.setTotalTime(totalTime);     Message message = mHandler.obtainMessage(1);     message.arg1 = i;     mHandler.sendMessage(message);    }   }  } }}

項目地址

源碼

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對VEVB武林網的支持。


注:相關教程知識閱讀請移步到Android開發頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产日韩中文字幕| 韩国国内大量揄拍精品视频| 亚洲精品有码在线| 91精品国产高清久久久久久久久| 亚洲无限av看| 91热福利电影| 日韩高清av一区二区三区| 欧美肥老妇视频| 性欧美在线看片a免费观看| 热草久综合在线| 亚洲精品电影久久久| 亚洲欧美日韩国产成人| 国产精品成人av在线| 久久综合国产精品台湾中文娱乐网| 亚洲人成在线观看网站高清| 成人黄在线观看| 亚洲第一偷拍网| 日韩中文字幕在线看| 亚洲视频网站在线观看| 亚洲qvod图片区电影| 亚洲精品99久久久久中文字幕| 欧美电影免费在线观看| 欧美日韩电影在线观看| 欧美在线免费视频| 美女扒开尿口让男人操亚洲视频网站| 成人黄色午夜影院| 亚洲视频欧美视频| 欧美在线免费看| 日韩欧美在线视频日韩欧美在线视频| 成人精品福利视频| 日韩av影院在线观看| 91精品久久久久久久久不口人| 久久精品99国产精品酒店日本| 久久人人97超碰精品888| 2021国产精品视频| 国产一级揄自揄精品视频| 韩国美女主播一区| 97涩涩爰在线观看亚洲| 国产丝袜一区二区三区| 亚洲女同性videos| 欧美一区在线直播| 欧美在线免费视频| 日韩欧美极品在线观看| 欧美性猛交xxxx富婆| 亚洲欧美国产日韩天堂区| 国产精品999| 国产精品你懂得| 国产成人中文字幕| 色一情一乱一区二区| 91精品91久久久久久| 成人a级免费视频| 国产一区二区三区欧美| 久久色精品视频| 91影视免费在线观看| 亚洲丝袜在线视频| 精品欧美激情精品一区| 97人人模人人爽人人喊中文字| 欧美日韩一二三四五区| 成人在线一区二区| 欧美日韩亚洲系列| 国产精品偷伦免费视频观看的| 亚洲日本中文字幕免费在线不卡| 欧美性理论片在线观看片免费| 日韩成人在线播放| 久久久久久久久亚洲| 91国产美女在线观看| 亚洲免费电影一区| 亚洲欧美色婷婷| 亚洲成人精品视频| 亚洲综合中文字幕在线| 在线视频中文亚洲| 久久久久久噜噜噜久久久精品| 国产999精品视频| 中日韩午夜理伦电影免费| 亚洲欧美日韩久久久久久| 一区二区欧美久久| 久久久极品av| 在线视频欧美日韩| 欧美老女人性视频| 97国产精品人人爽人人做| 亚洲国产精品久久久久秋霞蜜臀| 2019国产精品自在线拍国产不卡| 久久成人综合视频| 国产精品国产亚洲伊人久久| 日韩av免费观影| 亚洲视频自拍偷拍| 国产精品久久久久不卡| 国产成人亚洲综合青青| 日韩精品在线观看网站| 日韩中文字幕视频在线观看| 日韩av网址在线观看| 亚洲精品之草原avav久久| 欧美激情一二区| 中文字幕自拍vr一区二区三区| 日韩美女视频免费看| 欧美综合一区第一页| 亚洲欧美日韩第一区| 亚洲的天堂在线中文字幕| 久久影视电视剧凤归四时歌| 亚洲精品mp4| 国产精品久久久久久久久免费看| 黑人巨大精品欧美一区二区一视频| 日韩av成人在线| 日韩中文字幕在线视频播放| 国产69久久精品成人看| 亚洲japanese制服美女| 午夜欧美不卡精品aaaaa| 综合国产在线视频| 亚洲热线99精品视频| 日韩电影免费在线观看中文字幕| 日韩最新中文字幕电影免费看| 久久色精品视频| 18久久久久久| 黄色成人av网| 久久久综合免费视频| 欧美日韩另类字幕中文| 欧美www在线| 日本91av在线播放| 欧美专区在线观看| 国产一区二区三区高清在线观看| 国产精品久久久久久久久久久久久久| 久久人人爽人人爽人人片亚洲| 亚洲欧美在线第一页| 精品国产1区2区| 久久精品99久久久久久久久| 欧美激情性做爰免费视频| 中文字幕9999| 欧洲精品久久久| 精品高清一区二区三区| 国产精品久久久久久久久久免费| 欧美在线亚洲在线| 亚洲精品一区久久久久久| 亚洲一区二区三区成人在线视频精品| 亚洲国产欧美一区二区三区同亚洲| 国产精品九九久久久久久久| 中文字幕一区日韩电影| 激情成人在线视频| 欧美成在线视频| 麻豆国产va免费精品高清在线| 久久99精品久久久久久琪琪| 红桃视频成人在线观看| 欧美综合在线观看| 亚洲精品久久久久久久久久久久| 在线精品视频视频中文字幕| 97超级碰碰人国产在线观看| 欧美性猛交99久久久久99按摩| 亚洲精品网址在线观看| 日韩网站在线观看| 亚洲第一男人av| 欧美中文字幕在线观看| 亚洲aⅴ男人的天堂在线观看| 日本精品视频在线观看| 亚洲最大的av网站| 国产精品久久久久久网站| 成人免费黄色网| 亚洲国产一区自拍| 国产不卡视频在线| 国产日韩欧美视频在线| 欧美性在线观看| 欧美精品日韩www.p站| 亚洲第一精品电影| 欧美精品在线观看| 97超级碰碰人国产在线观看| 久久亚洲国产精品|