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