[英]How to update field on Firestore using RecyclerView with onClick?
我有一個使用Firestore Adapters
的RecyclerView
。 我的itemView
上有一個按鈕。 我正在嘗試這樣做,以便在按下按鈕時,它將done
的 boolean 字段從 false 更改為 true。 我正在努力理解如何將這兩者聯系在一起。
目前,我可以通過界面讀取RecyclerView
內的哪個 position 並將其顯示在我的Log
上。 但僅此而已。 這是我的代碼:
界面:
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());
}
}
}
在我的 Main 上定義 onItemClick:
adapter = new DonorAdapter(options, new OnListAdminClick() {
@Override
public void onItemClick(int position) {
Log.d("ITEM_CLICK", "Clicked the item: " + position);
}
});
最后是我的 Firestore:
我在您的適配器 class 中看到您將 position 傳遞給 onItemClick() 方法,這不是很有幫助,因為它僅代表 RecyclerView 中單擊項目的 position。 但是,傳遞“donorUID”將幫助您解決問題。 這可以很容易地完成,繞過 DonorViewHolder 的構造函數的“donorUID”值。 現在你的接口聲明應該是這樣的:
public interface OnListAdminClick {
void onItemClick(int donorUID);
}
在您的活動中,您可以使用以下代碼行將“完成”屬性更新為 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);
}
}
}
});
}
});
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.