如何在回收器视图项目的倒数计时器到期后从回收器视图中删除项目?



我正在制作一些销售事件应用. 为此,我需要一个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取决于系统的时间,它不是一个固定的值。随着时间的流逝,你的一些计数器将完成计数。在Counter完成计数的那一刻,如果您重新计算expiryTime,它的值将是0。当你退出片段并重新进入它时,片段将被重新创建,回收视图将被重新创建,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();
}

相关内容

  • 没有找到相关文章

最新更新