Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/206.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用RecyclerView和onClick更新Firestore上的字段?_Java_Android_Firebase_Android Recyclerview_Google Cloud Firestore - Fatal编程技术网

Java 如何使用RecyclerView和onClick更新Firestore上的字段?

Java 如何使用RecyclerView和onClick更新Firestore上的字段?,java,android,firebase,android-recyclerview,google-cloud-firestore,Java,Android,Firebase,Android Recyclerview,Google Cloud Firestore,我有一个使用Firestore适配器的RecyclerView。我的项目视图上有一个按钮。我试图使其在按下按钮时,将布尔字段done从false更改为true。我正在努力理解如何将这两者联系在一起 目前,我能够通过一个界面读取回收视图中的哪个位置,并将其显示在我的日志上。但差不多就是这样。这是我的密码: 界面: public interface OnListAdminClick { void onItemClick(int position); } public class Donor

我有一个使用
Firestore适配器的
RecyclerView
。我的
项目视图上有一个按钮。我试图使其在按下按钮时,将布尔字段
done
从false更改为true。我正在努力理解如何将这两者联系在一起

目前,我能够通过一个界面读取
回收视图
中的哪个位置,并将其显示在我的
日志
上。但差不多就是这样。这是我的密码:

界面:

public interface OnListAdminClick {
    void onItemClick(int position);
}
public class DonorAdapter extends FirestoreRecyclerAdapter<DonorModel, DonorAdapter.DonorViewHolder> {

private OnListAdminClick onListAdminClick;

public DonorAdapter(@NonNull FirestoreRecyclerOptions<DonorModel> options, OnListAdminClick onListAdminClick) {
    super(options);
    this.onListAdminClick = onListAdminClick;
}

@Override
protected void onBindViewHolder(@NonNull DonorAdapter.DonorViewHolder holder, int position, @NonNull DonorModel model) {
    holder.rank.setText(String.valueOf(position + 1));
    holder.donorName.setText(model.getDonorName());
    holder.donorEmail.setText(model.getDonorEmail());
    holder.hospitalName.setText(model.getHospitalName());
    holder.bookingTime.setText(model.getTime());
    holder.status.setText(model.isDone() + "");
}

@NonNull
@Override
public DonorAdapter.DonorViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_adminview_single, parent, false);
    return new DonorViewHolder(view);
}

public class DonorViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {

    TextView rank;
    TextView donorName;
    TextView donorEmail;
    TextView hospitalName;
    TextView bookingTime;
    TextView status;
    Button done_btn;

    public DonorViewHolder(@NonNull View itemView) {
        super(itemView);

        rank = itemView.findViewById(R.id.adminview_position);
        donorName = itemView.findViewById(R.id.list_username);
        donorEmail = itemView.findViewById(R.id.list_email);
        hospitalName = itemView.findViewById(R.id.list_hospital_name);
        bookingTime = itemView.findViewById(R.id.list_booking_time);
        status = itemView.findViewById(R.id.status_booking);
        done_btn = itemView.findViewById(R.id.done_btn);

        done_btn.setOnClickListener(this);
    }

    @Override
    public void onClick(View view) {
         onListAdminClick.onItemClick(getAdapterPosition());
    }
}
}
        adapter = new DonorAdapter(options, new OnListAdminClick() {
        @Override
        public void onItemClick(int position) {
            Log.d("ITEM_CLICK", "Clicked the item: " + position);

        }
    });
我的适配器:

public interface OnListAdminClick {
    void onItemClick(int position);
}
public class DonorAdapter extends FirestoreRecyclerAdapter<DonorModel, DonorAdapter.DonorViewHolder> {

private OnListAdminClick onListAdminClick;

public DonorAdapter(@NonNull FirestoreRecyclerOptions<DonorModel> options, OnListAdminClick onListAdminClick) {
    super(options);
    this.onListAdminClick = onListAdminClick;
}

@Override
protected void onBindViewHolder(@NonNull DonorAdapter.DonorViewHolder holder, int position, @NonNull DonorModel model) {
    holder.rank.setText(String.valueOf(position + 1));
    holder.donorName.setText(model.getDonorName());
    holder.donorEmail.setText(model.getDonorEmail());
    holder.hospitalName.setText(model.getHospitalName());
    holder.bookingTime.setText(model.getTime());
    holder.status.setText(model.isDone() + "");
}

@NonNull
@Override
public DonorAdapter.DonorViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_adminview_single, parent, false);
    return new DonorViewHolder(view);
}

public class DonorViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {

    TextView rank;
    TextView donorName;
    TextView donorEmail;
    TextView hospitalName;
    TextView bookingTime;
    TextView status;
    Button done_btn;

    public DonorViewHolder(@NonNull View itemView) {
        super(itemView);

        rank = itemView.findViewById(R.id.adminview_position);
        donorName = itemView.findViewById(R.id.list_username);
        donorEmail = itemView.findViewById(R.id.list_email);
        hospitalName = itemView.findViewById(R.id.list_hospital_name);
        bookingTime = itemView.findViewById(R.id.list_booking_time);
        status = itemView.findViewById(R.id.status_booking);
        done_btn = itemView.findViewById(R.id.done_btn);

        done_btn.setOnClickListener(this);
    }

    @Override
    public void onClick(View view) {
         onListAdminClick.onItemClick(getAdapterPosition());
    }
}
}
        adapter = new DonorAdapter(options, new OnListAdminClick() {
        @Override
        public void onItemClick(int position) {
            Log.d("ITEM_CLICK", "Clicked the item: " + position);

        }
    });
最后我的Firestore:

public interface OnListAdminClick {
    void onItemClick(int position);
}
public class DonorAdapter extends FirestoreRecyclerAdapter<DonorModel, DonorAdapter.DonorViewHolder> {

private OnListAdminClick onListAdminClick;

public DonorAdapter(@NonNull FirestoreRecyclerOptions<DonorModel> options, OnListAdminClick onListAdminClick) {
    super(options);
    this.onListAdminClick = onListAdminClick;
}

@Override
protected void onBindViewHolder(@NonNull DonorAdapter.DonorViewHolder holder, int position, @NonNull DonorModel model) {
    holder.rank.setText(String.valueOf(position + 1));
    holder.donorName.setText(model.getDonorName());
    holder.donorEmail.setText(model.getDonorEmail());
    holder.hospitalName.setText(model.getHospitalName());
    holder.bookingTime.setText(model.getTime());
    holder.status.setText(model.isDone() + "");
}

@NonNull
@Override
public DonorAdapter.DonorViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_adminview_single, parent, false);
    return new DonorViewHolder(view);
}

public class DonorViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {

    TextView rank;
    TextView donorName;
    TextView donorEmail;
    TextView hospitalName;
    TextView bookingTime;
    TextView status;
    Button done_btn;

    public DonorViewHolder(@NonNull View itemView) {
        super(itemView);

        rank = itemView.findViewById(R.id.adminview_position);
        donorName = itemView.findViewById(R.id.list_username);
        donorEmail = itemView.findViewById(R.id.list_email);
        hospitalName = itemView.findViewById(R.id.list_hospital_name);
        bookingTime = itemView.findViewById(R.id.list_booking_time);
        status = itemView.findViewById(R.id.status_booking);
        done_btn = itemView.findViewById(R.id.done_btn);

        done_btn.setOnClickListener(this);
    }

    @Override
    public void onClick(View view) {
         onListAdminClick.onItemClick(getAdapterPosition());
    }
}
}
        adapter = new DonorAdapter(options, new OnListAdminClick() {
        @Override
        public void onItemClick(int position) {
            Log.d("ITEM_CLICK", "Clicked the item: " + position);

        }
    });

我在适配器类中看到,您将位置传递给onItemClick()方法,这没有多大帮助,因为它只表示在RecyclerView中单击的项目的位置。但是,传递“donorUID”将帮助您解决问题。这可以非常容易地完成,绕过“donorUID”值到DonorViewHolder的构造函数。现在,接口的声明应该如下所示:

public interface OnListAdminClick {
    void onItemClick(int donorUID);
}
在活动中,您可以使用以下代码行将“done”属性更新为true:

adapter = new DonorAdapter(options, new OnListAdminClick() {
    @Override
    public void onItemClick(int donorUID) {
        FirebaseFirestore rootRef = FirebaseFirestore.getInstance();
        CollectionReference bookingRef = rootRef.collection("UserBooking").document(donorUID).collection("Booking");
        Query donorUidQuery = bookingRef.whereEqualTo("donorUID", donorUID);
        donorUidQuery.get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
            @Override
            public void onComplete(@NonNull Task<QuerySnapshot> task) {
                if (task.isSuccessful()) {
                    for (DocumentSnapshot document : task.getResult()) {
                        document.getReference().update("done", true);
                    }
                }
            }
        });
    }
});
adapter=new donor适配器(选项,new OnListAdminClick(){
@凌驾
公共磁盘单击(int donorUID){
FirebaseFirestore rootRef=FirebaseFirestore.getInstance();
CollectionReference bookingRef=rootRef.collection(“UserBooking”).document(donorUID.collection(“Booking”);
Query donorUidQuery=bookingRef.whereEqualTo(“donorUID”,donorUID);
donorUidQuery.get().addOnCompleteListener(新的OnCompleteListener(){
@凌驾
未完成的公共void(@NonNull任务){
if(task.issusccessful()){
对于(DocumentSnapshot文档:task.getResult()){
document.getReference()更新(“完成”,true);
}
}
}
});
}
});

我要试试这个!但是有一个问题,
donorUID
是否应该在
int
中?是的,它也可以是int。但是,如果您将该id用作文档id,它将是一个字符串。我不确定如何将
donorUID
传递给
DonorViewHolder
的构造函数。但是,如果我用这种方式尝试,它是否仍然有效?是的,一旦你通过了donorUID,在你的DonorViewHolder课程中使用它,就这样。不客气,Scrin。