webentwicklung-frage-antwort-db.com.de

Entfernen eines Elements aus dem RecyclerView in Android

In meiner Anwendung sollte ich recyclerView verwenden und einige Elemente entfernen.
Ich möchte einige Elemente aus recyclerview entfernen und dazu schreibe ich folgenden Code in Adapter

public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> {

    private Context context;
    private List<TvTonightResult> model;

    public MyAdapter (Context context, List<TvTonightResult> model) {
        this.context = context;
        this.model = model;
    }

    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.row_tv_tonight, parent, false);

        return new ViewHolder(view);
    }

    @Override
    public void onBindViewHolder(MyAdapter.ViewHolder holder, final int position) {

        holder.tvTonightTitle.setText(Html.fromHtml(model.get(position).getName()));
        Glide.with(context)
                .load(model.get(position).getImageUrl())
                .placeholder(R.drawable.default_image)
                .override(600, 900)
                .diskCacheStrategy(DiskCacheStrategy.ALL)
                .listener(new RequestListener<String, GlideDrawable>() {
                    @Override
                    public boolean onException(Exception e, String model, Target<GlideDrawable> target, boolean isFirstResource) {
                        return false;
                    }

                    @Override
                    public boolean onResourceReady(GlideDrawable resource, String model,
                                                   Target<GlideDrawable> target, boolean isFromMemoryCache, boolean isFirstResource) {
                        return false;
                    }
                })
                .into(holder.tvTonightImage);

        long time = 5 * 1000;
        holder.tvTonightTimeCounter.start(time);
        holder.tvTonightTimeCounter.setOnCountdownEndListener(new CountdownView.OnCountdownEndListener() {
            @Override
            public void onEnd(CountdownView cv) {
                removeItem(position);
            }
        });
    }

    @Override
    public int getItemCount() {
        return 4;
    }

    public class ViewHolder extends RecyclerView.ViewHolder {

        private ImageView tvTonightImage, tvTonightChannel;
        private TextView tvTonightTitle, tvTonightDate;
        private CountdownView tvTonightTimeCounter;

        public ViewHolder(View itemView) {
            super(itemView);

            tvTonightImage = (ImageView) itemView.findViewById(R.id.row_tvTonightImage);
            tvTonightChannel = (ImageView) itemView.findViewById(R.id.row_tvTonightChannelImage);
            tvTonightTitle = (TextView) itemView.findViewById(R.id.row_tvTonightTitle);
            tvTonightTimeCounter = (CountdownView) itemView.findViewById(R.id.row_tvTonightTime);

        }
    }

    private void removeItem(int position) {
        model.remove(position);
        notifyItemRemoved(position);
        notifyItemRangeChanged(position, model.size());
    }
}

Ich möchte, wenn Sie diesen Code ausführen, entfernen item: 

holder.tvTonightTimeCounter.setOnCountdownEndListener(new CountdownView.OnCountdownEndListener() {
                @Override
                public void onEnd(CountdownView cv) {
                    removeItem(position);
                }
            });

Aber zeig mir diesen Fehler

FATAL EXCEPTION: main
Process: com.example.app, PID: 9711
Java.lang.IndexOutOfBoundsException: Index: 2, Size: 2
    at Java.util.ArrayList.remove(ArrayList.Java:477)
    at com.example.app.Adapters.TvTonightAdapter.removeItem(TvTonightAdapter.Java:102)
    at com.example.app.Adapters.TvTonightAdapter.access$300(MyAdapter.Java:29)
    at com.example.app.Adapters.TvTonightAdapter$2.onEnd(MyAdapter.Java:74)
    at com.example.app.Utils.Componenets.CountDownTimer.CountdownView$1.onFinish(CountdownView.Java:129)
    at com.example.app.Utils.Componenets.CountDownTimer.CustomCountDownTimer$1.handleMessage(CustomCountDownTimer.Java:74)
    at Android.os.Handler.dispatchMessage(Handler.Java:102)
    at Android.os.Looper.loop(Looper.Java:154)
    at Android.app.ActivityThread.main(ActivityThread.Java:6247)
    at Java.lang.reflect.Method.invoke(Native Method)
    at com.Android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.Java:872)
    at com.Android.internal.os.ZygoteInit.main(ZygoteInit.Java:762)

Wie kann ich diesen Fehler beheben und Elemente aus recyclerview entfernen?

8
Kol

Ich denke, Sie sollten remove(holder.getAdapterPosition()) anstelle von remove(position) aufrufen, da nach Ablauf des Countdowns des Inhabers seine Position möglicherweise geändert wurde.

Nehmen Sie die folgende Situation an:

1º Inhaber -> 5 Sekunden Countdown

2º Inhaber -> 10 Sekunden Countdown

Da der zweite Halter nach dem ersten nach 10 Sekunden endet, wird remove(1) aufgerufen. Da der erste Halter jedoch bereits entfernt wurde, ist die Position des zweiten Halters 0. Daher sollte remove(0) anstelle von remove(1) aufgerufen werden eine IndexOutOfBoundsException).

6
Gabriel Costa

versuch's einfach ,

int newPosition = holder.getAdapterPosition();

in Ihrer removeItem () -Methode und ersetzen Sie Position durch neue Position.

mögen ,

  private void removeItem(int position) {
    int newPosition = holder.getAdapterPosition();
    model.remove(newPosition);
    notifyItemRemoved(newPosition);
    notifyItemRangeChanged(newPosition, model.size());
}
7
Omi

Entfernen Sie das Element in Arraylist in Android

holder.mRemoveButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                // Get the clicked item label
                String itemLabel = mDataSet.get(position);
                // Remove the item on remove/button click
                mDataSet.remove(position);
                notifyItemRemoved(position);
                notifyItemRangeChanged(position,mDataSet.size());
                // Show the removed item label`enter code here`
                Toast.makeText(mContext,"Removed : " + itemLabel,Toast.LENGTH_SHORT).show();

}
1

Es ist nicht notwendig, Elemente zu entfernen, wenn Sie nur 4 Elemente anzeigen möchten 

 @Override
    public int getItemCount() {
        return (model.size()>4)?4:model.size();
    }
0
kuljeet singh

Wenn Sie nur vier Artikel anzeigen möchten, wenn mehr als vier Artikel vorhanden sind, und die genaue Anzahl der Artikel, wenn weniger als vier Artikel vorhanden sind. Dann können Sie folgendes verwenden: 

@Override
public int getItemCount() {
    int count = 0;
    if (model != null && model.size() > 0) {
        int listSize = model.size();
        if (listSize > 4) {
            count = 4;
        } else {
            count = listSize;
        }
    }
    return count;
}
0
Satan Pandeya
//////// set the position ////////

holder.tvTonightTimeCounter.setTag(position);

//////// remove item from recyclerview and arraylist ///////

holder.tvTonightTimeCounter.setOnCountdownEndListener(new CountdownView.OnCountdownEndListener() {
                    @Override
                    public void onEnd(CountdownView cv) {
                    int positionToRemove = (int)view.getTag(); //get the position of view to delete stored in the tag
                    model.remove(positionToRemove);
                    notifyDataSetChanged();
                    }
                });
0
roshan posakya