web-dev-qa-db-fra.com

Comment supprimer un élément de recyclerView dans Android

Dans mon application, je devrais utiliser recyclerView et supprimer certains éléments.
Je veux supprimer quelques éléments de recyclerview et pour cela j'écris le code ci-dessous dans Adaptateur

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

Je veux quand exécuter ce code, remove item: 

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

Mais montrez-moi cette erreur

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)

Comment puis-je corriger cette erreur et supprimer un élément de recyclerview?

8
Kol

Je pense que vous devriez appeler remove(holder.getAdapterPosition()) au lieu de remove(position) car, une fois le compte à rebours terminé, le titulaire pourrait avoir changé de position.

Supposons la situation suivante:

Titulaire 1º - compte à rebours> 5 secondes

Titulaire 2º - compte à rebours de> 10 secondes

Puisque le second titulaire termine après le premier, après 10 secondes, remove(1) sera appelé, mais, comme le premier titulaire a déjà été supprimé, la position du second titulaire sera 0. Il devra donc appeler remove(0) au lieu de remove(1) (ce qui entraînera IndexOutOfBoundsException).

6
Gabriel Costa

juste essayer,

int newPosition = holder.getAdapterPosition();

dans votre méthode removeItem () et remplacez position par une nouvelle position.

comme ,

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

Supprimer l'élément dans Arraylist dans 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
Sanjay Umaraniya

Il n'est pas nécessaire de supprimer des éléments si vous ne souhaitez afficher que 4 éléments, changez simplement la méthode get count comme ci-dessous 

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

Si vous souhaitez afficher uniquement quatre éléments s'il y a plus de quatre éléments et le nombre exact d'élément s'il y en a moins de quatre. Ensuite, vous pouvez utiliser ceci: 

@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