RecyclerView 中的 Flcikers 倒计时器

问题描述 投票:0回答:1

我的片段中有两个选项卡。在我的回收器视图中,有两种视图类型,这两种视图类型根据芯片中的按键进行填充。在创建视图时,它工作正常。但是当我从第二个视图类型返回时,第一个视图类型中的倒计时器有点闪烁。它显示一个数字,然后更改为另一个数字。

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();

这是我的代码。谁能指出我可以做些什么来避免这种情况

java android android-recyclerview countdowntimer
1个回答
0
投票

您可能应该将

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));
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.