Несколько CountDownTimer в Recyclerview не в синхронизации - PullRequest
1 голос
/ 31 октября 2019

У меня многократный обратный отсчет в RecyclerView. Первоначально он синхронизирован (секунды меняются одновременно), но после прокрутки вверх и вниз в течение некоторого времени CountDown теряет синхронизацию. Изменения в секундах не синхронизированы, а также разница (в миллисекундах) между изменениями первого и второго просмотров. Первоначально разница между 1-й и 2-й датой составляла 10 секунд, после прокрутки пару раз она достигала 20 секунд.

Класс адаптера

public class EventAdapter extends RecyclerView.Adapter<EventAdapter.ViewHolder> {
    private LayoutInflater layoutInflater;
    private Context context;
    private NavController navController;
    private ArrayList<Date> datesArray;

    public EventAdapter(NavController navController, ArrayList<Date> datesArray) {
        this.navController = navController;
        this.datesArray = datesArray;
    }

    @NonNull
    @Override
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        IntroAdapter.ViewHolder holder = null;
        if (layoutInflater == null) {
            layoutInflater = LayoutInflater.from(parent.getContext());
        }
        context = parent.getContext();
        EventLayoutBinding binding = DataBindingUtil.inflate(layoutInflater, R.layout.event_layout, parent, false);
        return new EventAdapter.ViewHolder(binding);
    }

    @Override
    public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
        if (holder.timer == null) {
            holder.timer = new CountDownTimer(Utils.getDifferenceInMilli(datesArray.get(position)), 1000) {
                @Override
                public void onTick(long l) {
                    holder.itemView.tvTime.setText(Utils.getCountDownTime(l, 0));
                }

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

    @Override
    public int getItemCount() {
        return datesArray.size();
    }

    public class ViewHolder extends RecyclerView.ViewHolder {
        CountDownTimer timer;
        EventLayoutBinding itemView;

        public ViewHolder(@NonNull EventLayoutBinding itemView) {
            super(itemView.getRoot());
            this.itemView = itemView;
        }

    }
}

getDifferenceInMilli()возвращает разницу в миллисекундах между текущей датой и предоставленной датой.

Есть ли способ сохранить синхронизацию после прокрутки?

...