[英]How do you call a fragment method from an adapter?
我想在用户点击按钮时刷新我的回收视图,问题是我的回收视图在片段内,并且我的用户界面正在从我的 OnBindViewHolder 方法更新。 所以,我的问题是如何从适配器调用片段内的方法。 当用户从我的适配器单击 plusImageView 时,我想从我的 Cart_Fragment 调用我的 downloadCartData() 。 我在堆栈溢出上找到了一些说使用接口的答案,但我不明白发生了什么或如何将它应用到我的代码中。
public class CartAdapter extends RecyclerView.Adapter<CartAdapter.ViewHolder> {
private List<CartModel> cartArrayList;
private Context ct;
public int count = 1;
private String loggedInUserId;
public CartAdapter(List<CartModel> cartArrayList, Context ct) {
this.cartArrayList = cartArrayList;
this.ct = ct;
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.cart_row, parent, false);
return new ViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, @SuppressLint("RecyclerView") final int position) {
holder.produceName.setText(cartArrayList.get(position).getProductName());
Log.i("productname", cartArrayList.get(position).getProductName());
holder.producePrice.setText("$" + cartArrayList.get(position).getItemPrice());
holder.plusImageView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
getCurrentUserUid();
count = count + 1;
FirebaseDatabase.getInstance().getReference("Cart").child(loggedInUserId).child(cartArrayList.get(position).getTimestamp()).child("quantity").setValue(count).addOnCompleteListener(new OnCompleteListener<Void>() {
@Override
public void onComplete(@NonNull Task<Void> task) {
if(task.isSuccessful()){
holder.middleQUanityTv.setText(count + "");
// Cart_Fragment cart_fragment = new Cart_Fragment();
// cart_fragment.callMethod();
//
}
}
});
}
});
//Log.i("IMAGES", productArrayList.get(position).getProductImage());
Glide.with(ct)
.load(cartArrayList.get(position).getProductImage())
.centerCrop()
.into(holder.productImage);
}
@Override
public int getItemCount() {
return cartArrayList.size();
}
public class ViewHolder extends RecyclerView.ViewHolder {
private TextView produceName, producePrice, middleQUanityTv;
private ImageView productImage, plusImageView, minusImageView;
public ViewHolder(@NonNull View itemView) {
super(itemView);
produceName = itemView.findViewById(R.id.itemNameTv);
producePrice = itemView.findViewById(R.id.priceTv);
productImage = itemView.findViewById(R.id.productImageView);
plusImageView = itemView.findViewById(R.id.plusImageView);
middleQUanityTv = itemView.findViewById(R.id.middleQuanaityTv);
}
}
//hide ui elements here..
public void getCurrentUserUid() {
FirebaseUser firebaseUser = FirebaseAuth.getInstance().getCurrentUser();
if (firebaseUser != null) {
loggedInUserId = firebaseUser.getUid(); //Do what you need to do with your uid
Log.i("loggedInUserUid", loggedInUserId);
}
}
}
public void downloadCartData() {
cartDb.child("Cart").child(loggedInUserId).addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for (DataSnapshot data : dataSnapshot.getChildren()) {
if (data.exists()) {
//get the item prices to add to hashmap.
String price = data.child("itemPrice").getValue().toString();
String quantity = data.child("quantity").getValue().toString();
priceArrayList.add(price);
quantityArrayList.add(quantity);
cartModel = data.getValue(CartModel.class);
cartModelArrayList.add(cartModel);
LinearLayoutManager horizontalLayoutManager = new LinearLayoutManager(getContext(), LinearLayoutManager.VERTICAL, false);
cartRecyleView.setLayoutManager(horizontalLayoutManager);
cartAdapter = new CartAdapter(cartModelArrayList, getContext());
cartRecyleView.setAdapter(cartAdapter);
} else {
Log.i("error", "Error Loading JSON data..");
}
}
calculatePrice(priceArrayList, quantityArrayList);
Log.i("priceArrayList", priceArrayList + "");
Log.i("quanityArrayList", quantityArrayList + "");
}
@Override
public void onCancelled(DatabaseError databaseError) {
String error = databaseError.getDetails();
Log.i("error", error);
}
});
}
您已经从其他堆栈溢出帖子中了解到,您可以使用接口从适配器调用片段的方法。
首先你必须创建一个接口并在接口中定义方法名称。
interface DownloadCart{
void downloadCartData();
}
创建此接口后,您需要将此接口实现到声明回收器视图的片段中。
class Cart_Fragment implements DownloadCart{
将此接口实现到 class 后,它将在 android 工作室中显示红线。 它将需要将接口的方法添加到您的片段中。 将您的downloadCartData代码添加到片段中的此接口方法主体中。
void downloadCartData(){
cartDb.child("Cart").child(loggedInUserId).addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for (DataSnapshot data : dataSnapshot.getChildren()) {
if (data.exists()) {
//get the item prices to add to hashmap.
String price = data.child("itemPrice").getValue().toString();
String quantity = data.child("quantity").getValue().toString();
priceArrayList.add(price);
quantityArrayList.add(quantity);
cartModel = data.getValue(CartModel.class);
cartModelArrayList.add(cartModel);
LinearLayoutManager horizontalLayoutManager = new LinearLayoutManager(getContext(), LinearLayoutManager.VERTICAL, false);
cartRecyleView.setLayoutManager(horizontalLayoutManager);
cartAdapter = new CartAdapter(cartModelArrayList, getContext());
cartRecyleView.setAdapter(cartAdapter);
} else {
Log.i("error", "Error Loading JSON data..");
}
}
calculatePrice(priceArrayList, quantityArrayList);
Log.i("priceArrayList", priceArrayList + "");
Log.i("quanityArrayList", quantityArrayList + "");
}
@Override
public void onCancelled(DatabaseError databaseError) {
String error = databaseError.getDetails();
Log.i("error", error);
}
});
}
在接口 object 上创建到您的适配器中。
DownloadCart inf;
像这样定义您的适配器构造函数并将您的接口 object 传递到适配器调用中。
public CartAdapter(List<CartModel> cartArrayList, Context ct, DownloadCart inf) {
this.cartArrayList = cartArrayList;
this.ct = ct;
this.inf = inf;
}
之后,在绑定视图持有者上,使用接口 object 将您的片段方法调用到适配器中。它将从片段中调用方法。
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, @SuppressLint("RecyclerView") final int position) {
holder.produceName.setText(cartArrayList.get(position).getProductName());
Log.i("productname", cartArrayList.get(position).getProductName());
holder.producePrice.setText("$" + cartArrayList.get(position).getItemPrice());
holder.plusImageView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
getCurrentUserUid();
count = count + 1;
FirebaseDatabase.getInstance().getReference("Cart").child(loggedInUserId).child(cartArrayList.get(position).getTimestamp()).child("quantity").setValue(count).addOnCompleteListener(new OnCompleteListener<Void>() {
@Override
public void onComplete(@NonNull Task<Void> task) {
if(task.isSuccessful()){
holder.middleQUanityTv.setText(count + "");
inf.downloadCartData();
}
}
});
}
});
//Log.i("IMAGES", productArrayList.get(position).getProductImage());
Glide.with(ct)
.load(cartArrayList.get(position).getProductImage())
.centerCrop()
.into(holder.productImage);
}
Tadaaa.!! 并且您的片段方法是从适配器调用的。
将 Cart_Fragment 传递到您的适配器构造函数中,然后只需通过引用传递的 Fragment 来调用您尝试从 onClickListener 引用的方法。
private Cart_Fragment cart_fragment = new Cart_Fragment();
public CartAdapter(List<CartModel> cartArrayList, Context ct, Cart_Fragment cart_fragment) {
this.cartArrayList = cartArrayList;
this.ct = ct;
this.cart_fragment = cart_fragment;
}
@Override
public void onClick(View view) {
getCurrentUserUid();
count = count + 1;
FirebaseDatabase.getInstance().getReference("Cart").child(loggedInUserId).child(cartArrayList.get(position).getTimestamp()).child("quantity").setValue(count).addOnCompleteListener(new OnCompleteListener<Void>() {
@Override
public void onComplete(@NonNull Task<Void> task) {
if(task.isSuccessful()){
holder.middleQUanityTv.setText(count + "");
Cart_Fragment cart_fragment = new Cart_Fragment();
cart_fragment.callMethod();
}
}
});
}
});
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.