日本免费精品_最新日韩一区_亚洲视频一区在线_a在线视频观看_天天射夜夜骑_粉嫩av一区二区三区_欧美中日韩免费视频_综合图区欧美_国内精品美女在线观看_午夜精品久久久久久久男人的天堂

首頁 > 系統 > 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開發頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
欧美成人vr18sexvr| 欧美三级在线看| 日韩精品在线视频观看| 国产丝袜在线播放| 欧美日韩不卡在线视频| 青青久在线视频免费观看| 日韩a一区二区| 精品视频资源站| 亚洲福利视频专区| 一级日本免费的| 欧美日韩精品欧美日韩精品| 欧美久久久精品| 91精品国产综合久久精品 | 欧美 日韩 国产 在线| 精品国内自产拍在线视频| 亚洲校园欧美国产另类| 91久久久精品| 国产主播中文字幕| 精品成a人在线观看| 一区二区中文视频| wwwav在线播放| 中文网丁香综合网| 日韩欧美在线字幕 | 日韩高清不卡在线| 日韩三级在线播放| 在线视频色在线| 国产v日产∨综合v精品视频| 精品一二三四区| 欧美黄页在线免费观看| 欧美国产一区视频在线观看| 欧美日韩国产首页在线观看| 日韩欧美在线不卡| 免费国产成人看片在线| 国产中文伊人| 日韩中文字幕在线一区| 亚洲热线99精品视频| 91xxx在线观看| 久久综合九色欧美综合狠狠| 日本一欧美一欧美一亚洲视频| 中文国产字幕在线观看| 综合激情一区| 日韩精品在线中文字幕| 欧美日韩在线视频首页| 最近中文字幕日韩精品| 国产欧美日韩在线| 91xxx在线观看| 久久精品女人| 欧美日韩一二三| 欧美亚洲免费高清在线观看| 天天综合天天| 第一页在线观看| 欧美另类专区| 高清国产一区| 精品日韩在线观看| 久久精品国产视频| 日韩亚洲一区中文字幕| 国产欧美日韩在线观看| av影视在线看| 欧美 日韩 国产 在线观看| www..com日韩| 天堂在线视频中文网| 日韩免费视频一区二区| 精品婷婷伊人一区三区三| 精品久久人人做人人爽| 精品视频资源站| 精品三区视频| 亚洲一区视频在线观看视频| 欧美日韩国产一级片| 欧美1区免费| 亚洲免费看av| 日韩欧美中文字幕在线观看| 国产免费不卡av| 欧美日韩在线播放三区四区| 国产日产一区二区三区| 国自产拍在线网站网址视频| 久久永久免费视频| 欧美 日韩 国产在线观看| 日韩在线精品视频| 欧美三级网址| 精品欧美日韩精品| 91精品国产色综合久久不卡蜜臀| 91久久久精品国产| 一级日韩一级欧美| 午夜少妇久久久久久久久| 91精品综合久久久久久| 欧美在线日韩精品| 91精品视频国产| 精品国产乱码久久久久久蜜臀| 欧美,日韩,国产在线| 日韩在线 中文字幕| 日韩国产成人精品| 欧美日韩国产系列| 国产第一页在线播放| 欧美激情一区二区三区在线| 视频一区二区不卡| 中文字幕精品在线播放| 欧美日韩国产中字| 日韩欧美不卡视频| www.精品av.com| 在线看欧美日韩| 欧美日韩精品区| 亚洲理论中文字幕| 中文在线视频| 久久99久久久久| 亚洲免费福利视频| 在线视频三区| 国产福利一区二区在线精品| 久久婷婷综合国产| www.eeuss影院| 人成在线免费视频| 亚洲黄色www| 欧美日韩精品综合在线| 在线观看免费国产成人软件 | 日韩在线观看视频一区| av三级在线观看| 欧美日韩在线三级| 最近免费中文字幕在线第一页| 国产成人va亚洲电影| 欧美一级日韩一级| 激情五月综合| 在线视频不卡国产V| 欧美日韩中文字幕在线视频| 久久精品欧美日韩精品| а√天堂8资源中文在线| 亚洲羞羞网站| 亚洲三级国产| 日韩精品在线网站| 国产在线精品日韩| 国产一级视频| 久久精品国产2020观看福利| 中文字幕欧美在线| 日韩欧美三级在线| 日韩在线三区| 在线观看91精品国产入口| 伊人亚洲视频| 欧美日韩国产高清| 欧美日韩在线综合| 亚洲二区自拍| 婷婷中文字幕一区| 日韩精品视频网站| 另类专区欧美| 欧美日韩精品免费看| 精品欧美久久久| 国产在线欧美| 日韩欧美国产高清| 中文官网资源新版中文第二页在线观看| 日韩精品在线视频| 99精品999| 日韩精品在线播放| 91精品免费在线观看| 国产 日韩 欧美 综合| 亚洲社区在线| www.久久久精品| 婷婷中文字幕一区三区| 天堂精品高清1区2区3区| 中文字幕日韩免费视频| 一区二区在线观| 亚洲va久久久噜噜噜久久| 又黄又www的网站| 91精品国产91| 午夜精品一区二区三区视频免费看| 欧美婷婷久久| 成年人黄国产| 影音先锋中文字幕在线观看| 亚洲最大黄色| 国产亚洲二区| 国产日韩av高清| 欧美日韩国产综合视频在线观看| 日韩精品视频免费播放| 中文字幕亚洲欧美| 免费日韩精品中文字幕视频在线| 国产在线观看a| 欧美不卡123| 一区二区视频在线| 亚洲欧美999| 日韩精品免费视频一区二区三区| 中文在线第一页| 色偷偷一区二区三区| 日韩高清在线不卡| 狠狠色噜噜狠狠狠狠97| 中文字幕欧美日韩在线不卡| 中文字幕国产日韩| 欧美在线视频二区| 亚洲乱码中文字幕| 伊人精品视频| 精品播放一区二区| 一区二区精品| 天堂在线视频中文网| 日韩精品手机在线| 色99中文字幕| wwwww亚洲| 色屁屁一区二区| 欧美日韩在线网站| 精品久久九九| 国产欧美日韩成人| 中文字幕综合在线| 中文字幕久久精品| 日韩精品在线私人| 日韩精品视频免费在线观看| 内射国产内射夫妻免费频道| 91精品国产日韩91久久久久久| 欧美三级日韩在线| 国产色在线视频| 日韩欧美一级二级三级久久久| 欧美日韩中文字幕在线观看| 天天综合天天综合| 久久久久黄色| 欧美三级在线看| 中文字幕日韩在线观看| 中文字幕亚洲第一| 精品三级久久| 欧美1区免费| 日韩视频不卡中文| av免费看在线| 久久69成人| 国产wwww| 丰满少妇一区| 日韩高清不卡一区二区| 欧美日韩第一区日日骚| 中文亚洲免费| 日韩欧美在线中文字幕| 国产福利精品导航| 日韩三级精品电影久久久| 91精品国产99| 中文在线不卡视频| 日韩精品中文在线观看| 亚洲区中文字幕| 中文字幕日韩在线观看| 免费一级欧美在线观看视频| 欧美不卡视频一区发布| aaa欧美日韩| 亚洲视频电影在线| 国产欧美日韩不卡免费| 精品久久91| 日韩欧美一二三| 日韩欧美亚洲日产国| 99精品一级欧美片免费播放| 欧美性极品xxxx做受| 亚洲三级中文字幕| 亚洲欧洲三级| 激情婷婷亚洲| 日韩欧美综合在线视频| 欧美日韩国产高清一区| 国产欧美日韩亚洲| 欧美日韩中文字幕综合视频| 91精品国产综合久久蜜臀| 日本国产在线视频| 亚洲一区在线观看网站| 国产成人精品免费久久久久| 精品日韩欧美在线| 韩国v欧美v日本v亚洲| 国产日产一区二区| 亚洲免费福利视频| 亚洲一区中文字幕在线| 国产高清在线视频| 精品国产免费视频| 中文字幕在线观看亚洲| 欧美三级日韩三级| 欧美日韩在线观看首页| 欧美 日韩 国产 在线| 精品久久九九| 精品日韩av一区二区| 国产欧美日韩中文字幕| 91精品国产综合久久久久| 日韩欧美一二三| 91精品国产综合久久福利| 亚洲一区不卡在线| 在线看的av| 黄色一区二区视频| 国产日韩1区| 国产91久久久久蜜臀青青天草二 | 欧美亚洲视频在线看网址| 精品在线网站观看| 欧美日韩国产专区| 亚洲一区精品电影| 免费高清视频日韩| 国产福利一区二区| 久久久91精品国产| 本道综合精品| 亚洲一级影院| 精品国产免费视频| 高清日韩中文字幕| 国产成人精品三级| 亚洲国产综合久久| h片精品在线观看| 婷婷中文字幕综合| 91精品网站| 日韩精品在线观看网站| 日韩免费电影网站| 最近高清中文在线字幕在线观看| 国产丝袜在线播放| 中文字幕欧美日韩在线不卡| 国产小视频免费在线观看| 日韩欧美国产高清| 日韩精品视频免费在线观看| 日本亚洲视频在线| 日韩中文字幕| 欧美日韩国产一二| 自拍日韩亚洲一区在线| 欧美一卡2卡3卡4卡| 日韩精品在线第一页| 亚洲永久免费视频| 国产v日产∨综合v精品视频| 日韩国产一区久久| 中文字幕在线导航| 精品日韩视频在线观看| 亚洲开心激情| 亚洲欧洲国产视频| 欧美在线视频第一页| 91精品视频国产| 国产真实乱子伦精品视频| 日韩欧美中文字幕一区| 亚洲国产福利视频| 黄色一区二区在线观看| 中文精品在线观看| 99综合视频| 日韩高清不卡在线| 亚洲精品中文字幕乱码三区不卡| 精品久久久精品| 欧美性极品xxxx做受| 亚洲免费福利视频| 中文亚洲欧美| 五月综合激情日本mⅴ| 亚洲开心激情| 中文字幕人成乱码在线观看| 亚洲一区精品在线| 天堂在线视频中文网| 在线观看av的网站| 日韩欧美视频一区二区三区四区| 欧美日韩在线不卡视频| 欧美日韩午夜在线视频| 日韩欧美中文视频| 国产 欧美 日韩 在线| 黄色国产在线| 午夜福利一区二区三区| 国产嫩草影院久久久久| 91精品国产综合久久福利| 日韩专区视频网站| 国产激情99| 国产亚洲福利| 欧美中文字幕在线观看视频| www.中文字幕在线观看| 日韩精品高清不卡| 欧美日韩在线播放三区四区| 精品婷婷伊人一区三区三| 日韩在线视频一区| 国产网站av| 91精选在线| 久久网站免费观看| 久久久精品日韩欧美| 亚洲综合欧美在线| 精品日韩av| 91精品日本| 久久精品一二三| 91精品免费观看| 免费视频最近日韩| 日韩中文字幕| 一二三区精品视频| 中文字幕欧美亚洲| 欧美日韩国产中文| 久草亚洲一区| 在线一区av| 国产字幕中文| 久久久久黄色| 日韩精品视频免费在线观看| 欧美日韩中文字幕日韩欧美| 婷婷久久综合九色国产成人| 欧美日韩在线中文字幕| 日韩欧美久久| 日本xxxwww免费视频| 免费高清在线一区| 久草视频在线看| 日韩国产专区| 久99久视频| 久久99蜜桃精品| www.精品视频| 一区二区三区久久| 国产123在线| 欧美婷婷精品激情| 日韩 国产 一区| 亚洲综合在线中文字幕| 蜜臀久久精品| 欧美三级日韩在线| 国产对白在线| 中文在线а√在线8| 99精品视频国产| 国产一区二中文字幕在线看| 欧美日韩国产高清视频| 国产丝袜一区二区| 日韩欧美中文字幕在线观看| 国产v日产∨综合v精品视频| 91精品国产自产观看在线| 国产一级免费| 中文字幕在线导航| 国产福利免费在线观看| 91久久精品视频| 国产午夜精品久久| 亚洲一区在线观看网站| 日韩精品在线观| 中文字幕 日韩 欧美|