2

Я извлекаю данные в firebase, и я хочу удалить его, если пользователь щелкнет элемент в recyclerview, но когда я дойду до 2 или 3 элементов в моем recyclerview, я получаю stacktrace, как это. И иногда элемент, который я нажал, ошибочен. Как это исправить?Удаление элемента в recyclerview с помощью OnClick. Firebase android

E/AndroidRuntime: FATAL EXCEPTION: main 
java.lang.IndexOutOfBoundsException: Invalid index 3, size is 2 
at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:251) 
at java.util.ArrayList.get(ArrayList.java:304) 
at com.firebase.ui.database.FirebaseArray.getItem(FirebaseArray.java:52) 
at com.firebase.ui.database.FirebaseRecyclerAdapter.getRef(FirebaseRecyclerAdapter.java:150) 
at com.myapp.maecea.ipon4.Expenses$3$1$2.onClick(Expenses.java:274) 
at android.support.v7.app.AlertController$ButtonHandler.handleMessage(AlertController.java:157) 
at android.os.Handler.dispatchMessage(Handler.java:99) 
at android.os.Looper.loop(Looper.java:137) 
at android.app.ActivityThread.main(ActivityThread.java:4745) 
at java.lang.reflect.Method.invokeNative(Native Method) 
at java.lang.reflect.Method.invoke(Method.java:511) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 
at dalvik.system.NativeStart.main(Native Method) 

Это мой код:

adapter = new FirebaseRecyclerAdapter < ExpenseData, myViewHolder > (
    ExpenseData.class, R.layout.listitem, myViewHolder.class, mRef.orderByChild("date").equalTo(date)) { 

    @Override 
    protected void populateViewHolder(final myViewHolder viewHolder, ExpenseData model, final int position) { 
     viewHolder.DateText.setText(model.getDate()); 
     viewHolder.ExpenseTitleText.setText(model.getExpensetitle()); 
     viewHolder.AmountText.setText(String.valueOf(String.format("%.2f", model.getAmount()))); 

     viewHolder.mView.setOnClickListener(new View.OnClickListener() {@ 
      Override 
      public void onClick(final View v) { 
       AlertDialog.Builder builder = new AlertDialog.Builder(Expenses.this); 
       builder.setMessage("Gusto mo ba talaga burahin ito, katulad ng pagkalimot niya sayo?").setCancelable(false) 
        .setPositiveButton("Yes", new DialogInterface.OnClickListener() { 
         @Override 
         public void onClick(DialogInterface dialog, int which) { 
          int selectedItems = position; 
          for (int i = selectedItems; i >= 1; i++) { 
           adapter.getRef(i).removeValue(); 
           adapter.notifyItemRemoved(i); 
          } 
         } 
        }) 
        .setNegativeButton("No", new DialogInterface.OnClickListener() { 
         @Override 
         public void onClick(DialogInterface dialog, int which) { 
          dialog.cancel(); 
         } 
        }); 
       AlertDialog dialog = builder.create(); 
       dialog.setTitle("Expenses"); 
       dialog.show(); 
      } 
     }); 
    } 
};  

recyclerView.setAdapter(adapter); 

ответ

0

IndexOutOfBoundsException, потому что вы увеличиваете значение индекса. Измените i++ на i-- в вашей петле. Этот код удаляет элемент из выбранных элементов в SelectedItems> = 1.

for (int i = selectedItems; i >= 1; i--) { 
    adapter.getRef(i).removeValue(); 
    adapter.notifyItemRemoved(i); 
} 

Если вы хотите удалить только один элемент (щелкнул пункт в целях рециркуляции) означает удалить цикл простого использования

adapter.getRef(i).removeValue(); 
adapter.notifyItemRemoved(i); 
+0

если я положил это в свой код, я получаю также indexOutOfBoundsException – Kmmp

+0

Есть ли у вас какие-либо решения? @Kmmp –

0

рассмотреть возможность использования viewHolder.getAdapterPosition() вместо position

 Смежные вопросы

  • Нет связанных вопросов^_^