2015-01-18 2 views
0

У меня есть RecyclerView, населенный CardView s. В методе onLongClickCardView 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 
    } 
} 

ответ

0

Для вероят ... где в адаптере можно реализовать метод, который использует getItemCount посмотреть, если нет карты остались. Вы делаете это в onCreateViewHolder recyclerview ...

onCreateViewHolder (родительская позиция ViewGroup, int position) { View v;

if(getItemCount==0){ 
    v = LayoutInflater.from(context).inflate(R.layout.some_layout, parent,false); 
}else{ 
    v = LayoutInflater.from(context).inflate(R.layout.some_other_layout, parent,false); 
    ViewHolder holder = new ViewHolder(v); 
return holder; 
} 

Для вероят исключения Когда элемент удаляются из recyclerview нового положения присвоенного но ArrayList управляет самим так после того, как называется notifyItemRemoved вы должны вызвать notifyDataSetChanged поэтому он будет переназначить позицию всего вида индекса ...

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()); 
recyclerview.removeViewAtIndex(viewHolder.getPosition()); 
notifyDataSetChanged(); 
        adapter.notifyItemRemoved(viewHolder.getPosition()); 
       } 
      }); 
Смежные вопросы