RecyclerView 绑定到 FirebaseRecyclerAdapter,选中复选框时删除了错误的行
RecyclerView binded to FirebaseRecyclerAdapter, wrong row deleted when checked a checkbox
我将 recyclerView
绑定到 FirebaseRecyclerAdapter
,并为 ViewHolder
中的复选框设置 OnClickListener
。
我的想法:
当一行的复选框被选中时,适配器将 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);
}
}
将您的 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();
}
});
问题是,在回收站视图中删除一个元素时,剩余元素的位置没有得到更新。因此,使用 "i" 作为索引是错误的。相反,使用:
messageViewHolder.getAdapterPosition()
我将 recyclerView
绑定到 FirebaseRecyclerAdapter
,并为 ViewHolder
中的复选框设置 OnClickListener
。
我的想法:
当一行的复选框被选中时,适配器将 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);
}
}
将您的 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();
}
});
问题是,在回收站视图中删除一个元素时,剩余元素的位置没有得到更新。因此,使用 "i" 作为索引是错误的。相反,使用:
messageViewHolder.getAdapterPosition()