【问题标题】:Update Firestore field inside a RecycleView更新 RecycleView 中的 Firestore 字段
【发布时间】:2019-05-03 20:42:13
【问题描述】:

我想在 OnClick 发生时更新我的​​ Firestore 中的一个字段。 问题是我不知道如何检索我的实际项目的 id,因为这是自动生成的。 (我想更新 assignedTo 字段)。 Firestore的结构如下::

我的适配器 RecyclerView 的代码 sn-p 是:

public class AvailableTaskListAdapter extends RecyclerView.Adapter<AvailableTaskListAdapter.ViewHolder> {
public List<Task> taskList;
Activity mActivity;
FirebaseFirestore firestore;

public AvailableTaskListAdapter(List<Task> taskList, Context mContext, FirebaseFirestore firestore) {
    this.taskList = taskList;
    this.mActivity = (Activity) mContext;
    this.firestore = firestore;
}

@NonNull
@Override
public AvailableTaskListAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
    View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.layout_available_tasks_item, viewGroup, false);
    view.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {


            //HERE I want to be happening the update of my field.


        }
    });
    return new AvailableTaskListAdapter.ViewHolder(view);

}

@Override
public void onBindViewHolder(@NonNull AvailableTaskListAdapter.ViewHolder viewHolder, int i) {
    viewHolder.tvEmail.setText(taskList.get(i).getUser());
    ...
}

@Override
public int getItemCount() {
    return taskList.size();
}

public class ViewHolder extends RecyclerView.ViewHolder {
    View mView;

    public TextView tvEmail;
    ...

    public ViewHolder(View itemView) {
        super(itemView);
        mView = itemView;

        tvEmail = (TextView) mView.findViewById(R.id.tvEmail);
        ...
    }
}

public void showDialog(final Activity activity) {
    final Dialog dialog = new Dialog(activity);
    dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
    dialog.setCancelable(false);
    dialog.setContentView(R.layout.dialog_apply_to_task);
    dialog.getWindow().setBackgroundDrawable(new ColorDrawable(android.graphics.Color.TRANSPARENT));

    FrameLayout mDialogNo = dialog.findViewById(R.id.frmNo);
    mDialogNo.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            Toast.makeText(activity.getApplicationContext(),"Cancel" ,Toast.LENGTH_SHORT).show();
            dialog.dismiss();
        }
    });

    FrameLayout mDialogOk = dialog.findViewById(R.id.frmOk);
    mDialogOk.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Toast.makeText(activity.getApplicationContext(),"Okay" ,Toast.LENGTH_SHORT).show();
            dialog.cancel();
        }
    });

    dialog.show();
}}

【问题讨论】:

  • 在哪个地方尝试获取 id?
  • 我评论了我想要得到它的地方。

标签: java android firebase android-recyclerview google-cloud-firestore


【解决方案1】:

正如我在您的代码中看到的,您获得了Task 对象的列表,但您没有获得每个文档的密钥。要解决这个问题,您需要跟踪适配器中文档的键和值。推荐的方法是保留两个列表,一个带有键,一个带有值。

所以首先你为适配器类中的键添加一个List&lt;String&gt;,如下所示:

private List<Task> taskList;
private List<String> keys;

然后更改您的构造函数以接受两个列表:

public AvailableTaskListAdapter(List<Task> taskList, List<String> keys, Context mContext, FirebaseFirestore firestore) {
//                                                                ^^^^
    this.taskList = taskList;
    this.keys = keys; //Intialize the the second list
    this.mActivity = (Activity) mContext;
    this.firestore = firestore;
}

然后,当您创建AvailableTaskListAdapter 类的新对象时,除了taskList,还传递keys 列表。

AvailableTaskListAdapter adapter = new AvailableTaskListAdapter(taskList, keys, mContext, firestore);

基本上,键列表的创建方式与创建值列表的方式相同。因此,当您遍历集合以创建 Task 对象列表时,还可以像这样获取 id:

FirebaseFirestore rootRef = FirebaseFirestore.getInstance();
CollectionReference tasksRef = rootRef.collection("tasks");
tasksRef.get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
    @Override
    public void onComplete(@NonNull Task<QuerySnapshot> task) {
        if (task.isSuccessful()) {
            List<Task> taskList = new ArrayList<>();
            List<String> keys = new ArrayList<>();
            for (QueryDocumentSnapshot document : task.getResult()) {
                Task t = document.toObject(Task.class);
                taskList.add(t);
                String key = document.getId();
                keys.add(key);
            }

            //Create/notify the adapter
        }
    }
});

【讨论】:

  • 好的,如果我在 onCreateViewHolder 中进行 onclick,并在那里使用 ID,可以吗?
  • 是的。你可以在每个需要的地方使用 id。
【解决方案2】:

只需将文档的文档 ID 存储在 Task 对象中。向任务对象添加一个新字段,如“taskId”,当您从 firebase 检索任务时使用 document.id 示例:

db.collection("cities")
    .whereEqualTo("capital", true)
    .get()
    .addOnSuccessListener { documents ->
        for (document in documents) {
            Log.d(TAG, "${document.id} => ${document.data}")
        }
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-06-11
    • 2021-07-20
    • 1970-01-01
    • 1970-01-01
    • 2018-05-25
    • 2018-09-15
    • 2019-02-13
    相关资源
    最近更新 更多