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。