单击RecyclerView时将数据写入Firebase

时间:2018-10-21 12:37:45

标签: java android firebase firebase-realtime-database

当我在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;
}

1 个答案:

答案 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时执行的。

希望这对您有所帮助。