Java – Delete the project from Recyclerview when the time expires

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);
        }
    }

}

PS: Here is the complete code demo in mine Available on GitHub account.

Related Problems and Solutions