I need to remove an item when time expired, partially i got output by referring this How to handle multiple countdown timers in ListView?
After scrolled the list, some of the time expired items are not removed and times are not updated.
package com.techno.deliveryboy.Adapter;
import android.os.Handler;
import android.support.v4.app.FragmentActivity;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import com.techno.deliveryboy.Pojos.DummyTimer;
import com.techno.deliveryboy.R;
import java.util.ArrayList;
import java.util.List;
import java.util.Timer;
import java.util.TimerTask;
/**
* Created by developer on 23/7/16.
*/
public class Incoiming_orders_Adapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
private LayoutInflater lf;
Boolean onBind = true;
private List<MyViewHolder> lstHolders;
ArrayList<Integer> unbindvalues=new ArrayList<>();
private Handler mHandler = new Handler();
List<DummyTimer> lstProducts=new ArrayList<>();
private Runnable updateRemainingTimeRunnable = new Runnable() {
@Override
public void run() {
synchronized (lstHolders) {
long currentTime = System.currentTimeMillis();
for (MyViewHolder holder : lstHolders) {
holder.updateTimeRemaining(currentTime);
}
}
}
};
public Incoiming_orders_Adapter(FragmentActivity activity, List<DummyTimer> lstProduct) {
lstHolders = new ArrayList<>();
lstProducts=lstProduct;
startUpdateTimer();
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View itemView = LayoutInflater.from(parent.getContext())
.inflate(R.layout.incoming_orders_item, parent, false);
return new MyViewHolder(itemView);
}
private void startUpdateTimer() {
Timer tmr = new Timer();
tmr.schedule(new TimerTask() {
@Override
public void run() {
mHandler.post(updateRemainingTimeRunnable);
}
}, 1000, 1000);
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
if(holder instanceof MyViewHolder){
onBind=true;
MyViewHolder holder1= (MyViewHolder) holder;
synchronized (lstHolders) {
lstHolders.add(holder1);
}
holder1.setData(lstProducts.get(position),position);
onBind=false;
}
}
@Override
public int getItemCount() {
return lstProducts.size();
}
public void removeAt(int position) {
/* for (Iterator<MyViewHolder> iterator = lstHolders.iterator(); iterator.hasNext();) {
iterator.remove();
}*/
if(!onBind) {
if(unbindvalues!=null&&unbindvalues.size()!=0&&position>=0){
for (Integer i:unbindvalues) {
lstProducts.remove(position);
notifyItemRemoved(position);
}
unbindvalues.clear();
}else {
if(position>=0){
lstProducts.remove(position);
notifyItemRemoved(position);
}
}
notifyDataSetChanged();
}else {
System.out.println("+Bind->true+");
if(position>=0)
unbindvalues.add(position);
}
}
public class MyViewHolder extends RecyclerView.ViewHolder {
public TextView title, tvTimeRemaining, genre;
DummyTimer mProduct;
public void setData(DummyTimer item, int position) {
mProduct = item;
title.setText(item.name);
updateTimeRemaining(System.currentTimeMillis());
}
public MyViewHolder(View view) {
super(view);
title = (TextView) view.findViewById(R.id.Item_Totalvalue);
tvTimeRemaining= (TextView) view.findViewById(R.id.Item_timeout);
}
public void updateTimeRemaining(long currentTime) {
long timeDiff = mProduct.expirationTime - currentTime;
if (timeDiff > 0) {
int seconds = (int) (timeDiff / 1000) % 60;
int minutes = (int) ((timeDiff / (1000 * 60)) % 60);
int hours = (int) ((timeDiff / (1000 * 60 * 60)) % 24);
tvTimeRemaining.setText(hours + " hrs " + minutes + " mins " + seconds + " sec");
} else {
// tvTimeRemaining.setText(String.valueOf(getAdapterPosition()));
removeAt(getAdapterPosition());
}
}
}
@Override
public long getItemId(int position) {
return position;
}
}
Please give your comment.