In my application, I have to use recyclerView and remove some elements.
I want to remove some elements from recyclerview , and for this I write the code below in the 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()); } }
I want this run to be done, delete :
holder.tvTonightTimeCounter.setOnCountdownEndListener(new CountdownView.OnCountdownEndListener() { @Override public void onEnd(CountdownView cv) { removeItem(position); } });
But show me this error :
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)
How can I fix this error and remove the item from recyclerview ?
source share