3

işaretlendiğinde ben recyclerViewFirebaseRecyclerAdapter bağlanan silinir ve ViewHolder onay kutularını için OnClickListener ayarlayın.RecyclerView, yanlış satır bir onay kutusu

Benim fikrim: Arka arkaya bir onay kutusu işaretli olduğunda
, adaptör getRef(clickedPosition) ve Firebase veritabanından satırı silmek removeValue arayacak. Bundan sonra, populateViewHolder çağrılır ve uygulama veritabanından en son verileri gösterecektir.

Sorun: Listenin altından silersem, sorun olmaz. Ancak, onay kutularını rasgele kontrol ediyorsanız, yanlış satırın silineceğini ve bazen de NULL konumuna sahip olacağını ve Android uygulaması çökmesine neden olacağını görürsünüz. Konumu kaydediyorum, bir satır silindikten sonra onay kutularının konumu doğru şekilde güncellenmiyor gibi görünüyor. Sorun, geri dönüşüm görünümünde bir element silinmesine ilişkin kalan elemanların pozisyonları güncellenen sakın edilir

@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(); 
     } 
    }); 

cevap

4
için populateViewHolder değiştirin

:

İşte benim kodudur. Yani, bir dizin olarak "i" kullanarak yanlıştır. Bunun yerine, kullanın:

messageViewHolder.getAdapterPosition() 
0

:

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); 
    } 
}