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

首頁 > 系統(tǒng) > Android > 正文

Android如何利用RecyclerView實(shí)現(xiàn)列表倒計(jì)時(shí)效果實(shí)例代碼

2019-10-21 21:25:06
字體:
供稿:網(wǎng)友

前言

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

運(yùn)行效果圖

Android,RecyclerView,倒計(jì)時(shí),代碼

實(shí)現(xiàn)思路

實(shí)現(xiàn)方法主要有兩個(gè):

1.為每個(gè)開始倒計(jì)時(shí)的item啟動(dòng)一個(gè)定時(shí)器,再做更新item處理;

2.只啟動(dòng)一個(gè)定時(shí)器,然后遍歷數(shù)據(jù),再做再做更新item處理。

經(jīng)過思考,包括性能、實(shí)現(xiàn)等方面,決定使用第2種方式實(shí)現(xiàn)。

實(shí)現(xiàn)過程

數(shù)據(jù)實(shí)體

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

倒計(jì)時(shí)

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()) {//不處于暫停狀態(tài)     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;    }   }  };

性能優(yōu)化方面

1.調(diào)用notifyItemChanged()方法后,不要更新整個(gè)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;  }  //更新某個(gè)控件,比如說只需要更新時(shí)間信息,其他不用動(dòng)  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("剩余時(shí)間: " + day + "天" + hour + "小時(shí)" + 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;//數(shù)據(jù) private Handler mHandler;//線程調(diào)度,用來更新列表 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); } /**  * 設(shè)置新的數(shù)據(jù)源  *  * @param list 數(shù)據(jù)  */ 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;  }  //更新某個(gè)控件,比如說只需要更新時(shí)間信息,其他不用動(dòng)  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("剩余時(shí)間: " + day + "天" + hour + "小時(shí)" + 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("剩余時(shí)間: " + day + "天" + hour + "小時(shí)" + 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()) {//不處于暫停狀態(tài)     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);    }   }  } }}

項(xiàng)目地址

源碼

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問大家可以留言交流,謝謝大家對VEVB武林網(wǎng)的支持。


注:相關(guān)教程知識(shí)閱讀請移步到Android開發(fā)頻道。
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
国产一区高清在线| 精品国内亚洲在观看18黄| 久久精品小视频| 国产精品精品软件视频| 狠狠综合久久av一区二区| 小说区视频区图片区| 精品视频网站| 久久精品日产第一区二区| 国产精品扒开腿做爽爽爽男男| 国产欧美一区二区三区在线看蜜臂| 日韩一区二区三区三四区视频在线观看| 久久国产精彩视频| 成年人黄国产| 三级网站免费观看| 激情视频亚洲| 国产吞精囗交久久久| 日本久久一区| 欧美日韩国产一区| 一本色道综合久久欧美日韩精品| 中文字幕有码热在线视频| 久久久久中文字幕2018| 麻豆精品一区| 热久久免费视频精品| 免费国产高清| 国产精品高清亚洲| 国产精品视频yy9099| 亚洲人在线视频| 亚洲自拍小视频免费观看| 户外露出一区二区三区| 国产又粗又长视频| 日韩欧美亚洲系列| 欧美激情办公室videoshd| 亚洲一区二区三区日本久久九| 亚洲一级片在线播放| 天天色综合久久| 制服丝袜影音先锋| 亚洲日韩中文字幕一区| 久久综合电影一区| 精品日产一区2区三区黄免费| 国内精品久久久久伊人av| av在线电影院| 不卡在线视频中文字幕| 久久亚洲捆绑美女| 天天操天天射天天爽| 亚洲成年人在线| 污污的网站在线免费观看| 亚洲精品久久久久avwww潮水| 日韩深夜福利| 亚洲高清色综合| 国语自产在线不卡| 中国女人一级毛片| 波多野结衣久草一区| 在线日韩成人| 精品自拍视频在线观看| 午夜激情成人网| 久久香蕉国产线看观看av| 视频精品导航| 欧美mv日韩mv亚洲| 狠狠干天天爱| 激情图片在线观看高清国产| 国产a级免费视频| 日本午夜免费一区二区| 欧美三级蜜桃2在线观看| 自拍在线观看| 国产视频久久| 国产尤物在线观看| 女女调教被c哭捆绑喷水百合| a级片在线免费| 精品视频资源站| 99视频在线观看地址| 欧洲在线视频一区| 成人性色生活片免费看爆迷你毛片| 亚洲第一av网站| 亚洲国产精品网站| 俄罗斯一级**毛片在线播放| 亚洲欧洲一区二区天堂久久| 精品久久国产视频| 国产色91在线| 欧美激情一区二区三区在线视频观看| 可骚可骚的黄视频网站| 亚洲综合激情另类小说区| 日日摸夜夜添夜夜添精品视频| 亚洲视频国产| 欧美激情va永久在线播放| 国产亚洲一区精品| 香蕉视频国产在线| 久久久无码精品亚洲国产| 日本我和搜子同居的日子高清在线| 99精品视频在线观看| 久久福利一区| jlzzjlzz国产精品久久| 精品国产欧美成人夜夜嗨| 亚洲欧美国产一本综合首页| 国产精品免费网站在线观看| 国产精品v欧美精品v日本精品动漫| 高清视频在线观看一区| jizzjizzjizz中国免费| 欧美日韩国产探花| 日韩欧美一区二区免费| 亚洲精品女av网站| 水蜜桃免费高清视频在线播放| 日本理论片午伦夜理片在线观看| 日本激情视频网| 国产美女99p| 欧美阿v一级看视频| 精品免费一区二区三区蜜桃| 国产999精品视频| 国产成人自拍视频在线| 亚洲图片123| 中文字幕欧美人妻精品一区| 亚洲七七久久综合桃花剧情介绍| 91成人在线观看喷潮蘑菇| 国产吧在线视频| 日本一区二区视频在线观看| 六月婷婷色综合| 麻豆亚洲精品| 亚洲成人自拍视频| 亚洲综合视频在线观看| 欧洲视频一区二区三区| 国内在线免费高清视频| 在线免费看毛片| 色图在线观看| 国产免费人做人爱午夜视频| 巨大荫蒂视频欧美另类大| 黑人精品一区二区三区| 国产ts一区| 亚洲依依成人| 欧美日韩最好看的视频| 日本a级在线| 亚洲精品18在线观看| 人妻少妇精品视频一区二区三区| 最近中文视频在线| 欧美区视频在线观看| 五月天av影院| 男人天堂网在线观看| 国产伦理在线观看| 日韩黄在线观看| 精品国免费一区二区三区| 亚洲综合图片区| 亚洲一区在线播放| 99视频在线观看免费| 久久男人av资源站| 欧美一级在线亚洲天堂| 国产精品最新乱视频二区| 久久要要av| 亚洲影院中文字幕| 亚洲欧美在线一区二区| 欧美成人免费网站| 男男电影完整版在线观看| 久久不射热爱视频精品| 日韩欧美中文在线视频| 影视先锋久久| 日韩精品一区二区三区四| 成人国产精品一区二区免费麻豆| 一区二区 亚洲| 少妇高潮大叫好爽喷水| 在线观看视频免费一区二区三区| 欧美一区二区视频免费观看| 欧美黄色免费| 97在线观看免费| 中文字幕5566| 俺去了亚洲欧美日韩| 国产l精品国产亚洲区在线观看| 性视频一区二区三区| 一区精品在线观看| 人妻激情另类乱人伦人妻| 日韩理论在线| 成年人免费观看的视频| 蜜桃传媒九九九| 三级欧美韩日大片在线看| 精品国产乱码久久久| 精品国产乱码久久久久久婷婷| 大尺度在线观看| 蜜臀av性久久久久av蜜臀妖精| 国产免费成人在线| 免费看黄色a级片| 久久久久久久久久久久久久| 99久久免费观看| 自拍视频网站| 亚洲欧美综合另类在线卡通| 成人午夜精品久久久久久久蜜臀| 国产在线观看色| 男女高潮又爽又黄又无遮挡| 夜夜嗨av禁果av粉嫩avhd| 熟妇人妻va精品中文字幕| 迷人的保姆韩国| 国产精品99久久久久久久女警| 中文字幕在线精品| 日韩欧美色电影| 韩国三级在线一区| 亚洲偷欧美偷国内偷| 日韩av理论片| 国产精品欧美激情| 日本道精品一区二区三区| 男女免费网站| 台湾佬成人中文网222vvv| 成 人免费视频播放| 欧美激情1区2区| 久久精品国产亚洲一区二区| 欧美日韩成人影院| 男女午夜激情视频| av成人app永久免费| 波多野结衣 在线| 韩国av中国字幕| 少妇久久久久久被弄到高潮| 日本最黄一级片免费在线| 国产精品第五页| 日韩av在线网| 三级a三级三级三级a十八发禁止| 欧美精品乱人伦久久久久久| 一二三四中文在线| 第84页国产精品| 五月婷婷六月激情| 久久久久亚洲av片无码v| 麻豆精品传媒视频观看| 国产精品中文字幕亚洲欧美| 久久亚洲人体| 欧美日韩在线观看一区| 日韩欧美四区| 三上悠亚在线免费观看| 成人久久18免费网站麻豆| 国产精品色视频| 日韩欧美成人精品| 在线播放日韩导航| 免费一级特黄3大片视频| 女人18毛片一区二区三区| 亚洲精品国产成人久久av盗摄| 亚洲柠檬福利资源导航| 天天操天天干天天| 午夜精品在线观看| 懂色aⅴ精品一区二区三区| 男人操女人免费| 国产在线观看a| 欧美在线观看视频一区| 精品大片一区二区| 成人黄色在线观看视频| 欧美最猛性xxxxx免费| 中文字幕乱伦视频| 成人区一区二区| 8mav在线| 欧美 日韩 国产 一区二区三区| 亚洲成人在线视频网站| 美女av在线免费观看| 久久久精品黄色| 蜜臀av一区二区三区有限公司| 在线亚洲免费| 91社区在线观看播放| 美美哒免费高清在线观看视频一区二区| 先锋影音一区二区三区| 伊人久久大香线蕉av一区二区| 欧美在线观看视频网站| www.噜噜色.com| 欧美日韩国产综合视频在线| 久久精品系列| 欧美激情第一区| 天天色综合6| 2020日本不卡一区二区视频| jizz大全欧美jizzcom| 久久免费午夜影院| 精品91一区二区三区| 97高清免费视频| 黄色免费在线看| 国产免费黄色网址| av中文字幕免费| 国产成人亚洲综合91精品| 国语对白精品一区二区| 亚洲av无码一区二区三区在线| 一区二区不卡在线视频 午夜欧美不卡'| 欧美精品久久久久久久久老牛影院| 国产欧美视频一区二区三区| 久久久久亚洲av无码网站| 狠狠色伊人亚洲综合网站色| 一区二区中文| 国外成人在线视频网站| 黄色电影网站在线观看| 精品人妻一区二区三区换脸明星| 亚洲国产综合av| 福利一区和二区| 国产91露脸中文字幕在线| 男女爱爱福利视频| 青青草视频网站| 国产三级黄色片| 欧美日韩中字一区| 亚洲欧美一区二区久久| 国产极品美女高潮无套久久久| 三妻四妾的电影电视剧在线观看| 啦啦啦在线视频免费观看高清中文| 亚洲影院中文字幕| 综合在线影院| 久久精品国产成人| 中文字幕永久免费视频| 久热在线中文字幕色999舞| 精品国产一区二区在线观看| 国产中文字字幕乱码无限| 神马午夜电影一区二区三区在线观看| 97精品国产97久久久久久春色| 成人av手机在线| 欧美精品导航| 亚洲第一会所001| 日韩免费高清一区二区| 国产精品亚洲成在人线| 色偷偷9999www| 欧美日韩成人影院| 十九岁完整版在线观看好看云免费| 免费萌白酱国产一区二区三区| av蓝导航精品导航| 久播影院第一理论片| 日本色图在线| 在线观看日韩电影| 黄色一级片在线免费观看| www.久久av.com| 亚洲欧美综合乱码精品成人网| 99久久夜色精品国产网站| 女人被爽到呻吟gif动态图下载| 国产成人精品a视频| 亚洲精品美女网站| 中国女人内谢69xxxx视频| 五月婷婷激情在线| 精品少妇人欧美激情在线观看| 天堂av在线| 99re视频精品| 97精品久久久中文字幕免费| 91视频一区| 久久精品欧美一区二区三区麻豆| 久久精品成人一区二区三区| 国产精品国产三级国产试看| 精品久久人妻av中文字幕| 国产精品久久综合av爱欲tv|