2016-07-01 6 views
2

私のデータを表示するrecyclerviewがあります。私のアダプタクラスでは、onBindViewHolder()の中に、クリック時に行を削除するボタンのリスナーを作成しました。最初はうまくいきますが、アイテムを削除しようとすると、リストのサイズが変更されていない場合と同じ位置値になります。onBindViewHolder()の位置がアイテムの削除によって更新されない

たとえば、私は4つのアイテムリストを持っています。 3番目のアイテム(インデックス2)を削除します。 4番目のアイテムは3番目のスロットに入り、リストのサイズは3になります。3番目のアイテムを削除しようとすると、アイテムの位置が更新されておらずインデックスが3のままであるため、IndexOutOfBoundsExceptionになります。

public void onBindViewHolder(final RecyclerView.ViewHolder holder, final int position) { 
     ItemRegistered item = registeredList.get(position); 
     if (holder.getItemViewType() == 0) { 
      final RegisteredViewHolder registeredViewHolder = (RegisteredViewHolder) holder; 
      registeredViewHolder.course.setText(item.getCourse()); 

      registeredViewHolder.btn.setOnClickListener(new View.OnClickListener(){ 
       @Override 
       public void onClick(View v) { 

        DialogInterface.OnClickListener dialogClickListener = new DialogInterface.OnClickListener() { 
         @Override 
         public void onClick(DialogInterface dialog, int which) { 
          switch (which){ 
           case DialogInterface.BUTTON_POSITIVE: 

            if (mButtonClickListener != null) { 

             Log.d("i", Integer.toString(position)); 
             Log.d("list size:", Integer.toString(registeredList.size())); 

             final String title = registeredList.get(position).getCourse(); 
             mButtonClickListener.onButtonClicked(title); 
            } 

            registeredList.remove(holder.getAdapterPosition()); 
            notifyItemRemoved(position); 
            break; 

           case DialogInterface.BUTTON_NEGATIVE: 
            //No button clicked 
            break; 
          } 
         } 
        }; 

        AlertDialog.Builder builder = new AlertDialog.Builder(registeredViewHolder.course.getContext()); 
        builder.setMessage("Jeni të sigurtë që doni të çregjistroheni?").setPositiveButton("Po", dialogClickListener) 
          .setNegativeButton("Jo", dialogClickListener).show(); 

       } 
      }); 
     } 
} 

答えて

1

は、リストから項目を削除しようとしてからアダプタに通知:ここでは3

は私onBindViewHolder()方法の一部のコードです。この行を置き換えるです

...

registeredList.remove(holder.getAdapterPosition()); 
notifyItemRemoved(position); 

remove(position);

今ちょうど

public void remove(int position){ 
registeredList.remove(position); 
notifyItemRemoved(position); 
// to animate the list deletion     
notifyItemRangeChanged(position, getItemCount()); 
} 

はそれが役に立てば幸い:)

..メソッドを作成し、ロジックを追加
関連する問題