我的片段中有两个选项卡。在我的回收器视图中,有两种视图类型,这两种视图类型根据芯片中的按键进行填充。在创建视图时,它工作正常。但是当我从第二个视图类型返回时,第一个视图类型中的倒计时器有点闪烁。它显示一个数字,然后更改为另一个数字。
long timeUntilStart = startDate.getTime() - currentTime.getTime();
long timeUntilEnd = endDate.getTime() - currentTime.getTime();
if (timeUntilStart > 0) {
CountDownTimer timer = new CountDownTimer(timeUntilStart, 1000) {
public void onTick(long millisUntilFinished) {
// Update the countdown timer text
long seconds = (millisUntilFinished / 1000) % 60;
long minutes = (millisUntilFinished / (1000 * 60)) % 60;
long hours = (millisUntilFinished / (1000 * 60 * 60));
((ExamListV2ActiveItemViewHolder) holder).binding.tvRemainingTime.setText(String.format("%02d Hour: %02d min :%02d sec", hours, minutes, seconds));
}
public void onFinish() {
((ExamListV2ActiveItemViewHolder) holder).binding.btnJoin.setVisibility(View.VISIBLE);
((ExamListV2ActiveItemViewHolder) holder).binding.tvStarts.setText(context.getResources().getString(R.string.exam_starts_in));
((ExamListV2ActiveItemViewHolder) holder).binding.btnJoin.setVisibility(View.VISIBLE);
CountDownTimer timer = new CountDownTimer(timeUntilEnd, 1000) {
public void onTick(long millisUntilFinished) {
// Update the countdown timer text
long seconds = (millisUntilFinished / 1000) % 60;
long minutes = (millisUntilFinished / (1000 * 60)) % 60;
long hours = (millisUntilFinished / (1000 * 60 * 60));
((ExamListV2ActiveItemViewHolder) holder).binding.tvRemainingTime.setText(String.format("%02d Hour %02d Min %02d Sec", hours, minutes, seconds));
}
public void onFinish() {
((ExamListV2ActiveItemViewHolder) holder).binding.tvRemainingTime.setText(context.getResources().getString(R.string.exam_ended));
}
};
timer.start();
}
};
timer.start();
这是我的代码。谁能指出我可以做些什么来避免这种情况
您可能应该将
CountDownTimer
逻辑移至支架本身内部,并确保对 onViewRecycled
做出反应,否则您为 2 个支架创建一个 CountDownTimer,我猜它们会互相干扰
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
super.onViewRecycled(holder);
((ExamListV2ActiveItemViewHolder) holder).startTimer(startDate, endDate);
}
@Override
public void onViewRecycled(@NonNull ViewHolder holder) {
super.onViewRecycled(holder);
((ExamListV2ActiveItemViewHolder) holder).resetTimer();
}
你的持有人会是这样的:
class ExamListV2ActiveItemViewHolder extends RecyclerView.ViewHolder {
CountDownTimer timer;
public ExamListV2ActiveItemViewHolder(@NonNull View itemView) {
super(itemView);
}
public void startTimer(final Date startDate, final Date endDate) {
final Date currentTime = new Date();
final long timeUntilStart = startDate.getTime() - currentTime.getTime();
final long timeUntilEnd = endDate.getTime() - currentTime.getTime();
if (timeUntilStart > 0) {
timer = new CountDownTimer(timeUntilStart, 1000) {
public void onTick(long millisUntilFinished) {
setCountDownTime(millisUntilFinished);
}
public void onFinish() {
binding.btnJoin.setVisibility(View.VISIBLE);
binding.tvStarts.setText(itemView.getContext().getResources().getString(R.string.exam_starts_in));
binding.btnJoin.setVisibility(View.VISIBLE);
timer = new CountDownTimer(timeUntilEnd, 1000) {
public void onTick(long millisUntilFinished) {
setCountDownTime(millisUntilFinished);
}
public void onFinish() {
binding.tvRemainingTime.setText(itemView.getContext().getResources().getString(R.string.exam_ended));
}
};
timer.start();
}
};
timer.start();
}
}
public void resetTimer() {
if (timer != null) timer.cancel();
}
private void setCountDownTime(long time) {
long seconds = (time / 1000) % 60;
long minutes = (time / (1000 * 60)) % 60;
long hours = (time / (1000 * 60 * 60));
binding.tvRemainingTime.setText(String.format("%02d Hour: %02d min :%02d sec", hours, minutes, seconds));
}
}