繁体   English   中英

如何从适配器调用片段方法?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM