java - RecyclerView中的Android Count Down Timer在两个值之间闪烁
问题描述
亲爱的,
我想通过在 textview 中显示值来测试在 ReclyerView 中实现 countDownTimer。countDownTimer 在一个单独的类中。该值实际上显示在文本视图中,但它在两个值之间闪烁,其中一个是正确的,但另一个我不知道它来自哪里。请看看我下面的代码,让我知道我错过了什么?
public class MatchesAdapter extends
RecyclerView.Adapter<MatchesAdapter.myViewHolder> {
Context con;
private ArrayList<Matches> matchesAdapterList;
// Constructor
public MatchesAdapter(Context con, ArrayList<Matches> List) {
matchesAdapterList = List;
this.con = con;
}
public static class myViewHolder extends RecyclerView.ViewHolder{
public TextView tvTimer;
ConstraintLayout ccc;
public myViewHolder(@NonNull View itemView) {
super(itemView);
tvTimer = itemView.findViewById(R.id.tvTimer);
ccc = itemView.findViewById(R.id.cardViewContainer);
}
}
@NonNull
@Override
public myViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.cardview_item_layout, parent, false);
myViewHolder vh = new myViewHolder(v);
return vh;
}
@Override
public void onBindViewHolder(@NonNull myViewHolder holder, int position) {
final Matches currentItem = matchesAdapterList.get(position);
// This is where i am struggling
myTimer t = new myTimer(con, holder.tvTimer, currentItem.getMatchDate());
t.countDownStart();
}
@Override
public int getItemCount() {
return matchesAdapterList.size();
}
}
MyTimer 类
public class myTimer {
Context con;
TextView tvTimer;
Handler handler;
Runnable runnable;
String match_date_time;
public myTimer(Context con, TextView tvTimer, String match_date_time) {
this.con = con;
this.tvTimer = tvTimer;
this.match_date_time = match_date_time;
}
public void countDownStart() {
handler = new Handler();
runnable = new Runnable() {
@Override
public void run() {
handler.postDelayed(this, 1000);
try {
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
dateFormat.setTimeZone(TimeZone.getTimeZone("GMT+3:00"));
Date futureDate = dateFormat.parse(match_date_time); // provided value is something like this "2018-10-15 21:00:00"
Date currentDate = new Date();
if (!currentDate.after(futureDate)) {
long diff = futureDate.getTime() - currentDate.getTime();
long days = diff / (24 * 60 * 60 * 1000);
diff -= days * (24 * 60 * 60 * 1000);
long hours = diff / (60 * 60 * 1000);
diff -= hours * (60 * 60 * 1000);
long minutes = diff / (60 * 1000);
diff -= minutes * (60 * 1000);
long seconds = diff / 1000;
tvTimer.setText(String.format("%02d", days) + " " + String.format("%02d", hours) + " " + String.format("%02d", minutes) + " " + String.format("%02d", seconds) );
if (days < 1) {
tvTimer.setTextColor(con.getResources().getColor(R.color.RedError));
}
} else {
tvTimer.setText("Your time is up");
}
} catch (Exception e) {
System.out.println(e.getLocalizedMessage().toString());
}
}
};
handler.postDelayed(runnable, 1000);
}
}
请注意,我在没有使用 RecyclerView 的情况下测试了 myTimer 类,它工作得很好。
解决方案
检查RecyclerView 中的多个倒计时计时器在滚动时闪烁
在 onBindViewHolder 检查计时器是否已经初始化。如果已初始化,则先取消它,然后再启动它。
推荐阅读
- python - 可以在内置 lmfit 拟合模型中重命名自变量名称吗?
- php - php is_dir 函数奇怪的行为
- python - 如何修复无法识别应用程序的 tf.app.run() 错误?
- asp.net - 读取嵌入在 aspx 页面中的 xml
- asp.net-mvc - 在没有 AspNetCore Web 应用程序的情况下使用存储在 Razor 类库 3.0 (RCL) 中的 Razor 模板
- c# - .net core 3 equivalnet 配置用于添加 xml 序列化
- java - 在远程调试中暂停 Spring Boot Java 应用程序时,ECS 代理停止并重新启动 Docker 容器
- c# - 当我在 MVC 视图中尝试第二页时,ToPagedList 没有给出值
- git - 主分支更改后合并开发分支(已提交)
- javascript - 显示另一个div后如何显示div