onScroll RecyclerView Adapter中的Timer值更改



我在recyclerView中为每一行都有一个倒计时计时器,当数据第一次膨胀时,它会显示正确的数据。但一旦我向下滚动并返回到前一阶段,倒计时计时器就会显示错误的数据。我问了很多这样的问题,但我想不通。

JSON响应

{
"contest_id":10,
"contest_name":"PAK vs AUS",
"contest_time":"30.12.2018, 22:30:00",
"current_time":"04.12.2018, 11:16:50",
"micro_time":1543902410.850009918212890625,
"milliseconds":1543902410850
}

代码onBindViewHolder代码:

String parseServerDate= contestList.getContestTime();
String cureentServerDate = contestList.getCurrentTime();
if (holder.timer != null) {
holder.timer.cancel();
}
cureentServerDate= cureentServerDate.replaceAll(","," ");
parseServerDate= parseServerDate.replaceAll(","," ");
holder.countDownStart(cureentServerDate,parseServerDate,holder,position);

private void countDownStart(String s1, String s2, final MyViewHolder holder, int position) {
d1 = null;
d2 = null;
SimpleDateFormat formatter = new SimpleDateFormat("dd.MM.yyyy HH:mm:ss");
try {
d1 = formatter.parse(s1);
d2 = formatter.parse(s2);
diff = d2.getTime() - d1.getTime();
diffSeconds = diff / 1000 % 60;
diffMinutes = diff / (60 * 1000) % 60;
diffHours = diff / (60 * 60 * 1000) % 24;
diffDays = diff / (24 * 60 * 60 * 1000);
mydiff = TimeUnit.DAYS.toMillis(diffDays)+TimeUnit.HOURS.toMillis(diffHours)+TimeUnit.MINUTES.toMillis(diffMinutes)+TimeUnit.SECONDS.toMillis(diffSeconds);
calculateTimer(mydiff);
}
catch (Exception e)
{
System.out.print(e);
}
}


public void calculateTimer(long mydiff){
timer =  new CountDownTimer(mydiff,1000) {
@RequiresApi(api = Build.VERSION_CODES.N)
public void onTick(long millisUntilFinished) {
/*converting the milliseconds into days, hours, minutes and seconds and displaying it in textviews */
mDays.setText(checkDigit(Integer.parseInt(String.valueOf(TimeUnit.HOURS.toDays(TimeUnit.MILLISECONDS.toHours(millisUntilFinished))))) + "Days");
mHH.setText(checkDigit(Integer.parseInt(String.valueOf((TimeUnit.MILLISECONDS.toHours(millisUntilFinished) - TimeUnit.DAYS.toHours(TimeUnit.MILLISECONDS.toDays(millisUntilFinished)))))) + "" + ":");
mMM.setText(checkDigit(Integer.parseInt(String.valueOf((TimeUnit.MILLISECONDS.toMinutes(millisUntilFinished) - TimeUnit.HOURS.toMinutes(TimeUnit.MILLISECONDS.toHours(millisUntilFinished)))))) + ":");
mSS.setText(checkDigit(Integer.parseInt(String.valueOf((TimeUnit.MILLISECONDS.toSeconds(millisUntilFinished) - TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(millisUntilFinished)))))) + "");

}
@Override
public void onFinish() {
}
}.start();
}

你可以试试这个,它对我有效,在BindViewHolder内部,但这行

viewHolder.setIsRecyclable(false);

最新更新