Comment faire pour supprimer l'élément de la recyclerView dans android
Dans mon application, je devrais utiliser recyclerView et supprimer certains éléments.
Je veux supprimer certains éléments de recyclerview
et pour cela, je écrire de 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, supprimer élément :
holder.tvTonightTimeCounter.setOnCountdownEndListener(new CountdownView.OnCountdownEndListener() {
@Override
public void onEnd(CountdownView cv) {
removeItem(position);
}
});
Mais montrez-moi ce 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 l'élément de la recyclerview
?
OriginalL'auteur Kol | 2017-06-05
Vous devez vous connecter pour publier un commentaire.
Je pense que vous devriez appeler
remove(holder.getAdapterPosition())
au lieu deremove(position)
parce que, lorsque le titulaire du compte à rebours terminé, il a peut-être changé sa position.Supposons la situation suivante:
1º titulaire -> 5 secondes du compte à rebours
2º titulaire -> 10 secondes du compte à rebours
Depuis la deuxième détenteur se termine après la première, au bout de 10 secondes,
remove(1)
sera appelé, mais, depuis le premier titulaire a déjà été supprimé, le deuxième titulaire du poste sera de 0. Par conséquent, il devrait appelerremove(0)
au lieu deremove(1)
(qui va entraîner uneIndexOutOfBoundsException
).Il suffit de remplacer
remove(position)
pourremove(holder.getAdapterPosition())
à l'intérieur de votresetOnCountDownEndListener
.Bonne Réponse avec une bonne explication..
OriginalL'auteur Gabriel Costa
juste essayer ,
dans votre removeItem() la méthode et repalce position avec newPosition.
comme ,
J'ai utiliser ton code, mais ne fonctionne pas encore moi
essayez la mise à jour de réponse
OriginalL'auteur Omi
Supprimer l'élément dans la liste de tableaux dans Android
OriginalL'auteur Sanjay Umaraniya
Il n'est pas nécessaire de supprimer des éléments si vous souhaitez afficher seulement 4 articles il suffit de changer d'obtenir le comte de la méthode ci-dessous
OriginalL'auteur kuljeet singh
Si vous souhaitez afficher uniquement les quatre élément si il y a plus de quatre et le nombre exact d'article si il y a moins de quatre. Ensuite, vous pouvez utiliser ceci:
OriginalL'auteur Satan Pandeya
OriginalL'auteur roshan posakya