Delete the project from Recyclerview when the time expires… here is a solution to the problem.
Delete the project from Recyclerview when the time expires
I need to delete a project when the time expires, partly by referencing this How to handle multiple countdown timers in ListView? Got the output
After scrolling through the list, some items that expired in time were not removed and the time was 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 post your opinion.
Solution
You can > CountDownTimer
by setting To achieve this, this will trigger the onTick()
method once per second. 在 >onTick(). Does the method check if any objects are out of date? If you find any objects, call notifyItemRemoved()
to delete them.
Here is the code for the recycler View adapter:
Private class RecyclerViewAdapter
extension RecyclerView.Adapter {
private ArrayList mData;
public RecyclerViewAdapter(ArrayList<RowData> data) {
mData = data;
find out the maximum time the timer
long maxTime = System.currentTimeMillis();
for (RowData item : mData) {
maxTime = Math.max(maxTime, item.endTime);
}
set the timer which will refresh the data every 1 second.
new CountDownTimer(maxTime - System.currentTimeMillis(), 1000) {
@Override
public void onTick(long l) {
for (int i = 0, dataLength = mData.size(); i < dataLength; i++) {
RowData item = mData.get(i);
item.timeRemaining -= 1000;
}
remove the expired items
Iterator<RowData> dataIterator = mData.iterator();
while (dataIterator.hasNext()) {
RowData rd = dataIterator.next();
if (rd.timeRemaining <= 0) dataIterator.remove();
}
notifyDataSetChanged();
}
@Override
public void onFinish() {
mData.clear();
notifyDataSetChanged();
}
}.start();
}
@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
return new MyViewHolder(LayoutInflater.from(MainActivity.this).inflate(android. R.layout.simple_list_item_2, parent, false));
}
@Override
public void onBindViewHolder(MyViewHolder holder, int position) {
RowData rowData = mData.get(position);
holder.titleTv.setText(rowData.title);
holder.remainingTimeTv.setText(millToMins(rowData.timeRemaining) + " mins remaining");
}
private String millToMins(long millisec) {
return millisec / (60000) + ":" + (int) (millisec/1000) % (60);
}
@Override
public int getItemCount() {
return mData.size();
}
public class MyViewHolder extends RecyclerView.ViewHolder {
private TextView remainingTimeTv;
private TextView titleTv;
public MyViewHolder(View itemView) {
super(itemView);
remainingTimeTv = (TextView) itemView.findViewById(android. R.id.text2);
titleTv = (TextView) itemView.findViewById(android. R.id.text1);
}
}
}