Android Recyclerview中的多个倒计时不同步

Android Recyclerview中的多个倒计时不同步,android,android-recyclerview,countdowntimer,Android,Android Recyclerview,Countdowntimer,我在一个循环视图中有多次倒计时。一开始是同步的(秒同时改变),但在上下滚动一段时间后,倒计时会失去同步。秒更改不同步,并且第一视图和第二视图之间的差异(毫秒)也会更改。最初,第一次和第二次约会的时间差为10秒,滚动几次后,时间差增加到20秒 适配器类 public class EventAdapter extends RecyclerView.Adapter<EventAdapter.ViewHolder> { private LayoutInflater layoutInf

我在一个循环视图中有多次倒计时。一开始是同步的(秒同时改变),但在上下滚动一段时间后,倒计时会失去同步。秒更改不同步,并且第一视图和第二视图之间的差异(毫秒)也会更改。最初,第一次和第二次约会的时间差为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;
        }

    }
}
公共类EventAdapter扩展了RecyclerView.Adapter{ 私人停车场停车场停车场停车场停车场停车场停车场停车场停车场停车场停车场停车场停车场停车场停车场停车场停车场停车场停车场; 私人语境; 专用导航控制器; 私人ArrayList datesArray; 公共事件适配器(NavController NavController,ArrayList datesArray){ this.navController=navController; this.datesArray=datesArray; } @非空 @凌驾 public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent,int viewType){ IntroAdapter.ViewHolder=null; if(layoutInflater==null){ layoutInflater=layoutInflater.from(parent.getContext()); } context=parent.getContext(); EventLayoutBinding=DataBindingUtil.inflate(LayoutFlater,R.layout.event_layout,parent,false); 返回新的EventAdapter.ViewHolder(绑定); } @凌驾 public void onBindViewHolder(@NonNull ViewHolder,int位置){ if(holder.timer==null){ holder.timer=新的倒计时(Utils.getDifferenceInMilli(datesArray.get(position)),1000){ @凌驾 公共空白条(长l){ holder.itemView.tvTime.setText(Utils.getCountDownTime(l,0)); } @凌驾 公共无效onFinish(){ holder.timer.cancel(); } }.start(); } } @凌驾 public int getItemCount(){ 返回日期ray.size(); } 公共类ViewHolder扩展了RecyclerView.ViewHolder{ 倒计时; EventLayoutBinding项目视图; 公共视图持有者(@NonNull EventLayoutBinding itemView){ super(itemView.getRoot()); this.itemView=itemView; } } }
getDifferenceInMilli()
返回当前日期和提供日期之间的毫秒差


有没有办法在滚动后保持同步?

如果计时器不为空,您应该取消它并重新创建它。它起作用了。我试图创建一个全球倒计时服务。你认为这是一个更干净的方法吗?每个观景者倒计时是可以的。不需要globalif定时器不为空,您应该取消它并重新创建它。它起作用了。我试图创建一个全球倒计时服务。你认为这是一个更干净的方法吗?每个观景者倒计时是可以的。不需要全球合作