当我在RecyclerView中单击一个对象时,我正在尝试更新Firebase中的子记录,但是我无法使其工作。我正在下拉并正确填充ReyclerView。我需要的是单击对象时,我希望针对特定任务将Firebase中的“选定”子级更新为true。从一开始,所选子项为false并隐藏图像,当我单击Reyclerview中的对象时,应将其更新为true,以便显示该图像。希望您了解我在寻找什么并且可以帮助我。
Firebase结构
"groups": {
groupKey: {
"task": {
taskKey: {
"selected": "true"
}
}
}
}
这就是我得到的:
mDatabase = FirebaseDatabase.getInstance();
mDBRef = mDatabase.getReference().child("groups").child(projectID);
mDatabaseReference = mDatabase.getReference().child("groups").child(projectID).child("task");
mDBRef.addChildEventListener(new ChildEventListener() {
@Override
public void onChildAdded(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
taskList.clear();
for (DataSnapshot snapshot : dataSnapshot.getChildren()) {
Boolean selected = (Boolean) snapshot.child("selected").getValue();
TaskDataService taskDataService = new TaskDataService();
taskDataService.setSelected(selected);
taskList.add(taskDataService);
taskRecyclerAdapter = new TaskRecyclerAdapter(Project.this, taskList);
recyclerView.setAdapter(taskRecyclerAdapter);
taskRecyclerAdapter.notifyDataSetChanged();
DatabaseReference updateTaskToDB = mDatabaseReference.push();
Map<String, Object> taskToSave = new HashMap<>();
taskToSave.put("selected", taskDataService.getSelected());
updateTaskToDB.setValue(taskToSave);
}
}
});
RecyclerAdapter
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, final int position) {
final TaskDataService dataService = serviceList.get(position);
holder.imgCheckStatus = dataService.getSelected();
if (dataService.getSelected() == false) {
holder.checkImageView.setVisibility(View.INVISIBLE);
} else {
}
holder.linearLayout.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
dataService.setSelected(true);
Log.d("CLICK", String.valueOf(dataService.getSelected()));
}
});
}
DataService
public Boolean selected;
public Boolean getSelected() {
return selected;
}
public void setSelected(Boolean selected) {
this.selected = selected;
}
答案 0 :(得分:0)
而不是
holder.linearLayout.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
dataService.setSelected(true);
Log.d("CLICK", String.valueOf(dataService.getSelected()));
}
});
在ViewHolder类中,在构造函数中使用它,
itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//handle your click event here
}
});
在这里您可以使用getAdapterPosition()
方法来获取被点击项的位置,并用于从列表中获取数据,例如tasklist.get(getAdapterPosition())
并将selected
设置为true
,然后您就可以存储放在Firebase数据库中。
此外,请避免将任何点击事件处理到 onBindViewHolder 中,方法是将其放入 onCreateViewHolder 或您的 ViewHolder 类中。根据我的个人经验,它可以提高RecyclerView的性能,因为分配内存非常“昂贵”,所有分配任务都是在创建RecyclerView时执行的。
希望这对您有所帮助。