Записывать данные в базу данных при нажатии на RecyclerView - PullRequest
0 голосов
/ 21 октября 2018

Я пытаюсь обновить дочернюю заметку в firebase, когда нажимаю на объект в RecyclerView, но не могу заставить его работать.Я опускаю и заполняю ReyclerView правильно.Что мне нужно, так это когда я нажимаю на объект, я хочу, чтобы «выбранный» дочерний элемент в firebase обновлялся до true для этой конкретной задачи.С самого начала выбранный дочерний элемент является ложным и скрывает изображение, и когда я щелкаю объект в окне 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 голосов
/ 21 октября 2018

Вместо

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.

Надеюсь, это поможет вам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...