国产激情自拍_国产9色视频_丁香花在线电影小说观看 _久久久久国产精品嫩草影院

首頁 > 系統 > 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開發頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
国产激情自拍_国产9色视频_丁香花在线电影小说观看 _久久久久国产精品嫩草影院
免费精品国产自产拍观看| av二区三区| www.超级碰| sese在线视频| 在线观看wwww| 超碰国产在线| 久久综合精品视频| 导航福利在线| 中文字幕日本在线| 国产区视频在线| 97中文字幕| 久久一本精品| 精品视频在线一区二区| 麻豆国产视频| 精品成人一区二区三区免费视频| 亚洲天堂电影在线观看| 不卡av免费观看| 国产日韩欧美精品一区二区三区| 在线一区二区三区精品| www.av在线播放| 97国产视频| 国产美女视频一区二区三区| 国产一级黄色电影| 亚洲jjzzjjzz在线观看| 国产免费专区| av在线播放网| 国产午夜视频| 亚洲欧洲成人| 精精国产xxxx视频在线动漫| 狠狠狠狠狠狠操| 在线视频观看亚洲| 国产亚洲精品午夜高清影院| 日本不卡1区2区3区| 精品国内自产拍在线视频| 成人免费一区二区三区牛牛 | 日韩欧美中文字幕不卡| 国产乱人视频免费播放| 青青草视频免费在线观看| 99热免费在线| 在线午夜影院| 伊人中文在线| 永久免费av网站| 在线视频福利| 日本h片在线观看| 青青免费在线视频| 欧美激情福利视频在线观看免费| av资源网站在线观看| 国产超碰在线| 精品视频vs精品视频| 91www在线观看| 精品久久九九| 欧美日韩亚洲第一页| 青青草在线播放| 欧美性xxxx交| 午夜视频免费在线观看| 国产无遮挡又黄又爽免费网站| 国内自拍视频在线观看| 麻豆精品传媒视频观看| 久精品在线观看| 国产乱子视频| 国产激情视频在线| 精精国产xxxx视频在线动漫| 在线亚洲精品自拍| 青青草中文字幕| 中文字幕在线永久在线视频| 国产高清av| 欧美xxxxx性| 国产盗摄一区二区| 在线国产一级| 中文字幕网在线| 尤物视频在线观看视频| 黄色毛片在线| 国产精品18久久久久网站| 在线观看中文字幕一区| 免费a级毛片在线播放| 国产一级二级三级在线观看| 亚洲wwwwww| 国产麻豆麻豆| h网站免费在线观看| 国产精品视频一区二区图片| 亚洲精品天堂在线观看| 国产九九九九| 日p在线观看| 国产成人精品久久一区二区小说 | 国产乱妇乱子| 亚洲91av| 国产99在线|亚洲| 成人欧美精品久久久久影院| 精品久久亚洲一级α| 国产一级二级三级在线观看| 亚洲天堂久久久| 国产精美视频| 国产一区精品| 国产图片综合| 天堂在线免费观看| 久热久精久品这里在线观看| 在线看黄网站| 中文在线有码| 在线观看wwww| 日韩欧美中文字幕不卡| 亚洲欧美综合乱码精品成人网| 国产精美视频| 国产小视频在线观看| 九九免费视频| 国产精品偷乱一区二区三区| 欧美日韩亚洲第一页| 日本成人网址| 福利视频网站导航| 九九热在线视频观看| 国产精品一区二区婷婷| 最近中文字幕mv免费高清电影| 免费的黄网站在线观看| 国产专区在线播放| 九九免费视频| 国产偷窥洗澡视频| 91嫩草在线播放| av免费在线观看网站| 亚洲精品影视在线| 麻豆网站在线| 国产视频1区| 亚洲男人的天堂成人| 青青草原国产在线| 国产精品㊣新片速递bt| 国产欧美在线观看视频| 四虎精品视频| 中文字幕日本在线| 在线免费看av| 高潮白浆视频| 99热免费观看| 国产在线传媒| 99久久精品免费观看国产| 日本视频在线观看一区二区三区| 成年女人在线视频| 国产网站观看9久| 在线观看wwww| 中文字幕网在线| 亚洲国产成人综合| 国产精品理人伦一区二区三区| 日韩黄色成人| 在线中文字幕第一页| 国产精选一区二区三区不卡催乳| 亚洲欧美中文字幕在线观看 | 国产传媒在线播放| 超碰在线网址| 国产一级在线观看www色 | 四虎国产精品永久地址998| 国产蜜臀av在线播放| 在线视频婷婷| 国产亚洲精品一区二区在线观看| 欧美日韩在线视频免费观看 | 91中文字幕网| 午夜视频在线免费 | www在线观看播放免费视频日本| 国产精品视频流白浆免费视频| 99久热re在线精彩视频| 国产香蕉视频在线观看| 丁香婷婷在线观看| wwwww亚洲| 在线观看av中文| 97一区二区三区| 国产高清免费av在线| 国产视频第一区| 国产卡二和卡三的视频| 亚洲www色| 亚洲精品aaaa精品| gogogogo高清视频在线| 国产精品666| 69久久久久| 精品国产免费观看一区| 最新中文字幕在线| 99视频免费| 国产精品二线| 在线观看wwww| 久热免费视频| 国产精品国产国产aⅴ| 精品一区二区三区高清免费不卡 | 国产l精品国产亚洲区在线观看| 国产污污在线观看| 国产成免费视频| 亚洲精品视频区| 国产在线一二三区| 国产日韩欧美精品一区二区三区| 天天操天天艹| 国产免费黄网站| 国产视频一二区| 亚洲欧美综合乱码精品成人网| 亚洲视频在线观看不卡| 好看的中文字幕在线播放| 国产www视频在线观看| 在线观看国产视频| 欧美黑人乱大交| 国产高清在线看| 久久久久久久久久久久久91| 国产小视频免费在线网址| 91在线超碰| 国产永久免费高清在线观看视频| 国产对白在线| 日本电影在线观看| 国产激情二区| 免费高清av|