如何在 recyclerview 项目的倒数计时器到期后从 recyclerview 中删除项目?

How to Remove an item from recyclerview after recyclerview item's countdown timer expires?

我正在制作某种 促销活动应用程序。为此,我需要一个 Recyclerview,其中每个项目都有一个倒数计时器。每个项目都有倒计时,上面写着“销售开始于 XX 小时:YY 分钟”当项目倒计时结束时,项目应该下降到 Recyclerview 的底部。

我在 onbindviewholder 中制作了一个倒数计时器,但当计时器到期时我收到错误消息。请有人帮助我克服这个问题......这就是所需要的img

每个项目的到期时间来自 Firestore 数据库。

我正在我的 onbindViewholder 中这样做... 字符串 remTime;

@Override
public void onBindViewHolder(@NonNull Holder holder, int position) {
    ItemDet item = ItemArrayList.get(position);
    long timer = item.getCategoryTime().toDate().getTime();
    final long currentTime = System.currentTimeMillis();
    long expiryTime = timer - currentTime;

    if (holder.timer != null) {
        holder.timer.cancel();
    }

    holder.timer=new CountDownTimer(expiryTime, 1000) {
        public void onTick(long millisUntilFinished) {

            long seconds = millisUntilFinished / 1000;
            long minutes = seconds / 60;
            long hours = minutes / 60;
            long days = hours / 24;

            if(days==0){
                remTime= minutes % 60 + "m:" + seconds % 60+"s";
            }
            if(days<1 && hours>0 && minutes>0 && seconds>0){
                remTime= hours % 24 + "h:"+ minutes % 60 + "m";
            }
            if(days<1 && hours<1 && minutes>0 && seconds>0){
                remTime= minutes % 60 + "m:"+ seconds % 60+"s";
            }
            if(days<1 && hours<1 && minutes<1 && seconds>0){
                remTime= seconds % 60+"s";
            }
            if (days>0){
                remTime= days+"d, " +hours % 24 + "h";
            }
            holder.item_time_h.setText(remTime); 
        }

        public void onFinish() {
            holder.itemView.setEnabled(false);
            holder.item_time_h.setText("Time up!");

            ItemArrayList.remove(holder.adapterPosition());
            notifyItemRemoved(holder.adapterPosition());
            notifyItemRangeChanged(holder.adapterPosition(), ItemArrayList.size());
             
            //Here after timer finish i want to remove the item from the top and put it on bottom
            }

请帮我解决这个问题,我已经卡住了 2 周了

这应该不难。当计时器结束时,您应该将项目移动到列表的末尾,然后通知适配器。

public void onFinish() {
    holder.itemView.setEnabled(false);
    holder.item_time_h.setText("Time up!");

    int oldPosition = holder.adapterPosition();
    ItemDet item = ItemArrayList.remove(oldPosition);
    ItemArrayList.add(item);
    int newPosition = ItemArrayList.size() - 1;
    notifyItemMoved(oldPosition, newPosition);
}

希望我没有犯错。我没有测试代码。试试这个。我希望得到你的一些反馈。

更新

现在我看到你的 expiryTime 取决于系统的时间,它不是一个固定值。随着时间的流逝,您的一些计数器将完成计数。在计数器完成计数的那一刻,如果您重新计算 expiryTime,它的值将是 0。当您退出片段并重新进入时,片段将被重新创建,recyclerview 将被重新创建并且 expiryTime 将被重新计算并且它将是一个负值。因此,当创建回收器的布局时,计数器的 onFinish 方法将立即被调用。如果 expiryTime 为负,一个快速修复可能是不启动计时器。目前我认为你可以这样做:

final long currentTime = System.currentTimeMillis();
long expiryTime = timer - currentTime;

//ADD THIS HERE
if(expiryTime <= 0) {
    return;
}

if (holder.timer != null) {
    holder.timer.cancel();
}