3

Я привязываю к FirebaseRecyclerAdapter и устанавливает OnClickListener для флажков в ViewHolder.RecyclerView привязан к FirebaseRecyclerAdapter, неверная строка удалена, если флажок установлен. Checkbox

Моя идея:
Когда флажком строки проверяется, адаптер getRef(clickedPosition) и вызвать removeValue удалить строку из базы данных Firebase. После этого вызывается populateViewHolder, и приложение отображает последние данные из базы данных.

Проблема: Если я удалю из нижней части списка вверх, проблем нет. Однако, если флажки с произвольной проверкой, кажется, что неправильная строка будет удалена, а иногда даже будет иметь NULL положение и привести к сбою приложения для Android. Я зарегистрировал позицию, кажется, что позиция флажков обновлена ​​неправильно после удаления строки.

Вот мой код:

public Firebase mRef; 

// UI 
RecyclerView mRecyclerView; 

FirebaseRecyclerAdapter<Task, MessageViewHolder> adapter; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_my_task); 
    ... 
    ... 
    Firebase.setAndroidContext(this); 
    mRef = new Firebase("https://what-to-do-list.firebaseio.com/todoItems"); 

    mRecyclerView = (RecyclerView) findViewById(R.id.recyclerView); 
    mRecyclerView.setHasFixedSize(true); 
    mRecyclerView.setLayoutManager(new LinearLayoutManager(this)); 
} 


@Override 
protected void onStart() { 
    super.onStart(); 

    adapter = 
      new FirebaseRecyclerAdapter<Task, MessageViewHolder>(
        Task.class, 
        R.layout.custom_row_view, 
        MessageViewHolder.class, 
        mRef 
      ) { 
       @Override 
       protected void populateViewHolder(MessageViewHolder messageViewHolder, Task t, int i) { 

        messageViewHolder.mText.setText(t.getName()); 
        messageViewHolder.chkBox.setTag(i); 

        messageViewHolder.chkBox.setOnClickListener(new View.OnClickListener() { 
         @Override 
         public void onClick(View v) { 
          CheckBox cb = (CheckBox) v; 
          int clickedPos = ((Integer) cb.getTag()).intValue(); 


          Log.v("POSITION: ", String.valueOf(clickedPos)); 
          adapter.getRef(clickedPos).removeValue(); 
         } 
        }); 
       }  
      }; 
    mRecyclerView.setAdapter(adapter); 
} 

@JsonIgnoreProperties(ignoreUnknown = true) 
public static class MessageViewHolder 
     extends RecyclerView.ViewHolder { 
    TextView mText; 
    CheckBox chkBox; 

    public MessageViewHolder(View v) { 
     super(v); 
     mText = (TextView) v.findViewById(R.id.list_item_name); 
     chkBox = (CheckBox) v.findViewById(R.id.task_chkbox); 
    } 
} 

ответ

4

Изменить populateViewHolder на:

@Override 
protected void populateViewHolder(MessageViewHolder messageViewHolder, Task t, int i) { 

    final DatabaseReference ref = getRef(i); 
    messageViewHolder.mText.setText(t.getName()); 
    messageViewHolder.chkBox.setTag(ref); 

    messageViewHolder.chkBox.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      CheckBox cb = (CheckBox) v; 
      String key = cb.getTag().getKey(); 

      adapter.getRef(key).removeValue(); 
     } 
    }); 
0

Проблема, на удалении элемента в представлении ресайклера, позиции остальных элементов не получают обновляется. Таким образом, использование «i» в качестве индекса неверно. Вместо этого используйте:

messageViewHolder.getAdapterPosition()