【问题标题】:How to Remove an item from recyclerview after recyclerview item's countdown timer expires?recyclerview 项目的倒数计时器到期后如何从 recyclerview 中删除项目?
【发布时间】:2021-10-21 12:19:53
【问题描述】:

我正在制作某种促销活动应用程序。为此,我需要一个 Recyclerview,其中每个项目都有一个倒数计时器。每件商品都有倒计时,上面写着“促销开始于 XX hr: YY min”当商品倒计时到期时,该商品应该会下降到 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 周

【问题讨论】:

  • 你试过用notifyItemMoved(fromPosition, toPosition)
  • @Nitish ..是的,什么都试过了...但是当 1 项被删除时,要么它给我错误..或者当第 2 项被删除时,它给我错误
  • 什么样的错误?
  • 在 RecyclerView 计算布局或滚动时无法调用此方法:id/recyclerView2}
  • @Nitish ava.lang.IllegalStateException: 无法在 RecyclerView 计算布局或滚动时调用此方法 androidx.recyclerview.widget.RecyclerView{826538d VFED..... ......ID 11,425-1069,1976 #7f0a0237 app:id/recyclerView2},阿达

标签: android android-recyclerview


【解决方案1】:

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

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 将被重新计算,它将是一个负值。因此,当创建回收器的布局时,将立即调用 Counter 的 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();
}

【讨论】:

  • 嘿,谢谢你的回答..但我之前也试过..它给了我这个错误.......当 RecyclerView 正在计算布局或滚动 androidx.recyclerview 时无法调用此方法。 widget.RecyclerView{386d45e VFED..... ......ID 11,425-1069,1976 #7f0a0237 app:id/recyclerView2
  • 在 RecyclerView 计算布局或滚动时无法调用此方法 androidx.recyclerview.widget.RecyclerView{3370b04 VFED......... 11,425-1069,1976 #7f0a0237 app:id/ recyclerView2},适配器:com.example.pocketrocket.MyAdapter@68cc0b3,布局:androidx.recyclerview.widget.LinearLayoutManager@a16c670,上下文:com.example.pocketrocket.Scrollallgame@756e595 at androidx.recyclerview.widget.RecyclerView.assertNotInLayoutOrScroll(RecyclerView .java:3051) 在 androidx.recyclerview.widget.RecyclerView$RecyclerViewDataObserver.onItemRangeMoved(RecyclerView.java:5571)
  • 异常究竟是什么时候发生的?刚开始吗?可能是计时器行为异常,并且在加载回收器布局时触发了该方法。
  • 第一项删除很好,没有任何问题。第二项也被删除。如果我不去任何其他活动,应用程序不会崩溃(如果我保持相同的活动(最好是片段)应用程序不会崩溃)。当我导航并再次来到片段时,应用程序崩溃了。另外我想说的是,项目只是被删除,而不是被添加到底部。删除项目后它会留下一个空白空间
  • 我的 recylerview 在一个片段中......对不起,我在上一条评论的某处输入了活动
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-15
  • 2020-07-27
  • 2017-09-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多