欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

RecyclerView實現列表倒計時

 更新時間:2021年01月29日 11:11:31   作者:jcjkobe123  
這篇文章主要為大家詳細介紹了RecyclerView實現列表倒計時,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下

最近在做一個項目,需要用到列表倒計時功能,搗鼓半天終于弄了出來,在安卓中實現這個效果需要用到Countdowntimer,通過這個類的使用,不僅可以實現倒計時的效果,還可以完美解決在實現倒計時過程中的兩個bug。

1.內存問題
2.由于recyclerview的item復用導致不同條目的時間錯亂

首先看下實現的最終效果

如何顯示列表我相信大家都會,這里我只附上和倒計時功能實現的adapter類。

public class ClockAdapter extends RecyclerView.Adapter<ClockAdapter.ClockViewHolder> {
 private SparseArray<CountDownTimer> countDownMap = new SparseArray<>();

 @Override
 public ClockViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
 View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_rv, parent, false);

 return new ClockViewHolder(view);
 }
 /**
 * 清空資源
 */
 public void cancelAllTimers() {
 if (countDownMap == null) {
  return;
 }
 for (int i = 0,length = countDownMap.size(); i < length; i++) {
  CountDownTimer cdt = countDownMap.get(countDownMap.keyAt(i));
  if (cdt != null) {
  cdt.cancel();
  }
 }
 }

 @Override
 public void onBindViewHolder(final ClockViewHolder holder, int position) {
 long betweenDate;
 if (position == 0) {
  betweenDate= DateUtil.getLeftTime("2017-8-8 12:10:10");
 } else {
  betweenDate= DateUtil.getLeftTime("2017-8-9 15:10:10");
 }

 if (holder.countDownTimer != null) {
  holder.countDownTimer.cancel();
 }

 if (betweenDate > 0) {
  holder.countDownTimer = new CountDownTimer(betweenDate, 1000) {
  public void onTick(long millisUntilFinished) {
   millisUntilFinished = millisUntilFinished / 1000;
   int hours = (int) (millisUntilFinished / (60 * 60));
   int leftSeconds = (int) (millisUntilFinished % (60 * 60));
   int minutes = leftSeconds / 60;
   int seconds = leftSeconds % 60;

   final StringBuffer sBuffer = new StringBuffer();
   sBuffer.append(addZeroPrefix(hours));
   sBuffer.append(":");
   sBuffer.append(addZeroPrefix(minutes));
   sBuffer.append(":");
   sBuffer.append(addZeroPrefix(seconds));
   holder.clock.setText(sBuffer.toString());
  }
  public void onFinish() {
//   時間結束后進行相應邏輯處理
  }
  }.start();
  countDownMap.put(holder.clock.hashCode(), holder.countDownTimer);
 } else {
//  時間結束 進行相應邏輯處理
 }


 }

 @Override
 public int getItemCount() {
 return 25;
 }

 class ClockViewHolder extends RecyclerView.ViewHolder {

 TextView clock;
 CountDownTimer countDownTimer;

 public ClockViewHolder(View itemView) {
  super(itemView);
  clock = (TextView) itemView.findViewById(R.id.clock);
 }
 }
}

其中cancelAllTimer()這個方法解決了內存的問題,通過這行代碼,將item的hashcode作為key設入SparseArray中,這樣在cancelAllTimer方法中可以一個一個取出來進行倒計時取消操作。

countDownMap.put(holder.clock.hashCode(),holder.countDownTimer);

接著通過下面這行代碼新建一個CountDownTimer類

holder.countDownTimer = new CountDownTimer(betweenDate, 1000) {
 public void onTick(long millisUntilFinished) {
 millisUntilFinished = millisUntilFinished / 1000;
 int hours = (int) (millisUntilFinished / (60 * 60));
 int leftSeconds = (int) (millisUntilFinished % (60 * 60));
 int minutes = leftSeconds / 60;
 int seconds = leftSeconds % 60;
 final StringBuffer sBuffer = new StringBuffer();
 sBuffer.append(addZeroPrefix(hours));
 sBuffer.append(":")  sBuffer.append(addZeroPrefix(minutes));
   sBuffer.append(":");
   sBuffer.append(addZeroPrefix(seconds));
   holder.clock.setText(sBuffer.toString());
}
public void onFinish() {
// 時間結束后進行相應邏輯處理
}
}.start();

分析它的源碼

public CountDownTimer(long millisInFuture, long countDownInterval) {
 mMillisInFuture = millisInFuture;
 mCountdownInterval = countDownInterval;
 }

從中可以很清楚的看出,設置了兩個值,第一個是倒計時結束時間,第二個是刷新時間的間隔時間。
然后通過start方法進行啟動,接著看下start方法中進行的處理

public synchronized final CountDownTimer start() {
 mCancelled = false;
 if (mMillisInFuture <= 0) {
  onFinish();
  return this;
 }
 mStopTimeInFuture = SystemClock.elapsedRealtime() + mMillisInFuture;
 mHandler.sendMessage(mHandler.obtainMessage(MSG));
 return this;
 }

源碼中,當倒計時截止時間小于等0時也就是倒計時結束時,調用了onFinish方法,若時間還未結束,則通過handler的異步消息機制,將消息進行發(fā)出,通過一整個流程,最終方法會走到handler的handleMessage方法中,如果有不熟悉這個異步流程的伙伴,可以去看我以前寫的一篇異步消息機制的文章 android異步消息機制,源碼層面徹底解析。好了,接下來就來看看handler的handleMessage方法。

private Handler mHandler = new Handler() {

 @Override
 public void handleMessage(Message msg) {

 synchronized (CountDownTimer.this) {
 if (mCancelled) {
  return;
 }

 final long millisLeft = mStopTimeInFuture - SystemClock.elapsedRealtime();

 if (millisLeft <= 0) {
  onFinish();
 } else if (millisLeft < mCountdownInterval) {
 // no tick, just delay until done
 sendMessageDelayed(obtainMessage(MSG), millisLeft);
 } else {
long lastTickStart=SystemClock.elapsedRealtime();
  onTick(millisLeft);
 // take into account user's onTick taking time to execute
 long delay = lastTickStart + mCountdownInterval - SystemClock.elapsedRealtime();

// special case: user's onTick took more than interval to
// complete, skip to next interval
 while (delay < 0) delay += mCountdownInterval;
 sendMessageDelayed(obtainMessage(MSG), delay);
  }
  }
 }
 };

相信這段源碼還是很通熟易懂,首先計算出剩余時間,如果剩余時間小于刷新時間,就發(fā)送一條延時消息直到時間結束,如果剩余時間大于刷新時間就調用onTick(millisLeft)方法,這個方法在我們創(chuàng)建CountDownTimer類時就進行過重寫,在里面就可以寫我們倒計時展示的具體邏輯了。至此整個流程結束。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • 代碼從windows下visual studio到andriod平臺遷移實現步驟

    代碼從windows下visual studio到andriod平臺遷移實現步驟

    這篇文章主要介紹了代碼從windows下visual studio到andriod平臺遷移的修改記錄的相關資料,需要的朋友可以參考下
    2017-01-01
  • android中Intent傳值與Bundle傳值的區(qū)別詳解

    android中Intent傳值與Bundle傳值的區(qū)別詳解

    本篇文章是對android中Intent傳值與Bundle傳值的區(qū)別進行了詳細的分析介紹,需要的朋友參考下
    2013-05-05
  • Android實現多媒體之播放音樂

    Android實現多媒體之播放音樂

    這篇文章主要為大家詳細介紹了Android實現多媒體之播放音樂的相關資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-02-02
  • 基于TabLayout中的Tab間隔設置方法(實例講解)

    基于TabLayout中的Tab間隔設置方法(實例講解)

    下面小編就為大家分享一篇基于TabLayout中的Tab間隔設置方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2017-12-12
  • Android Studio添加日志過濾方式

    Android Studio添加日志過濾方式

    這篇文章主要介紹了Android Studio添加日志過濾方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-04-04
  • Android實現漸變色的圓弧虛線效果

    Android實現漸變色的圓弧虛線效果

    最近在學習Android的paint類的時候,學習了PathEffect路徑效果和Shader渲染效果。所以就做了下面的一個效果,其中自定義的view組主要是用DashPathEffect、SweepGradient的API形成的效果。感興趣的朋友們可以參考借鑒,下面來一起看看吧。
    2016-10-10
  • 淺談Android客戶端與服務器的數據交互總結

    淺談Android客戶端與服務器的數據交互總結

    這篇文章主要介紹了淺談Android客戶端與服務器的數據交互總結,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-09-09
  • Android Google AutoService框架使用詳解

    Android Google AutoService框架使用詳解

    AutoService是Google開發(fā)一個自動生成SPI清單文件的框架??催^一些基于APT的三方框架源碼的讀者應該有所了解。比如Arouter、EventBus等等
    2022-11-11
  • 深入理解Android中的建造者模式

    深入理解Android中的建造者模式

    建造者模式將一個復雜的構建與其表示相分離,使得同樣的構建過程可以創(chuàng)建不同的表示。所以這篇文章主要介紹了Android中的建造者模式,有需要的朋友們可以參考借鑒。
    2016-09-09
  • Android實現計時與倒計時的方法匯總

    Android實現計時與倒計時的方法匯總

    這篇文章主要介紹了Android實現計時與倒計時的方法匯總,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2017-06-06

最新評論