У меня есть RecyclerView
, населенный CardView
s. В методе onLongClick
CardView
s я открываю диалоговое окно с возможностью удаления этой карты, но у меня возникают проблемы с сбоем приложения. Если у меня есть несколько карточек и удаляю их по одному, он иногда бросает IndexOutOfBoundsExceptions
или CursorIndexOutOfBoundsExceptions
, когда я пытаюсь удалить несколько строк подряд.Удаление элементов из RecyclerView исключает исключение OutOfBounds
Важно отметить, что если я удалю его, оставьте это действие, а затем верните его, все будет хорошо, когда я попытаюсь удалить другое. Это потому, что адаптер заменен новым?
Я не уверен, как исправить проблему. Любые советы приветствуются. Благодаря!
Кроме того, еще один быстрый запрос: где в адаптере можно реализовать метод, который использует getItemCount
, чтобы увидеть, нет ли оставшихся карт, а затем раздуть новый макет? В настоящее время у меня есть что-то вроде этого, реализованного в классе Fragment
, который создает и назначает этот адаптер, но он не будет работать, если актив не будет воссоздан.
Здесь большая часть кода в моем классе адаптера, который простирается RecyclerView.Adapter<SessionAdapter.ViewHolder>
:
private MyAdapter adapter = this;
public MyAdapter (ArrayList<MyObject> mArrayList, ...)
{
this.mArrayList = mArrayList;
//...
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i)
{
View v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.card, viewGroup, false);
return new ViewHolder(v);
}
@Override
public void onBindViewHolder(ViewHolder viewHolder, int i)
{
final MyObject mMyObject = mArrayList.get(i);
viewHolder.mCardView.setOnLongClickListener(new View.OnLongClickListener()
{
@Override
public boolean onLongClick(View v)
{
AlertDialog.Builder dialog = new AlertDialog.Builder(mContext);
dialog.setTitle(R.string.title_delete);
dialog.setMessage(R.string.prompt_delete);
dialog.setPositiveButton(R.string.delete, new DialogInterface.OnClickListener()
{
@Override
public void onClick(DialogInterface dialog, int which)
{
//delete from SQLite database
dialog.dismiss();
mArrayList.remove(viewHolder.getPosition());
adapter.notifyItemRemoved(viewHolder.getPosition());
}
});
return false;
}
});
public class ViewHolder extends RecyclerView.ViewHolder
{
public CardView mCardView;
//buttons and things that go inside the CardView
public ViewHolder(View v)
{
super(v);
mCardView = (CardView) v.findViewById(R.id.card_view);
//buttons and things that go inside the CardView
}
}