Call a callback to a fragment from an adapter

0

I hope you can help me, I have been looking for a solution for weeks and I only need this to finish a project. I want to call a method (UpdateItemcount) but I can not do it from my adapter. I have tried in several ways but it involves changing the constructor I have and it ends up not working.

this is my fragment

public class Selection2 extends Fragment implements Actualizarvalor {

TextView catidadproductos, valortotal;
RecyclerView recycler_cart;
CompositeDisposable compositeDisposable;
List<Cart> cartList;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    // Inflate the layout for this fragment
    View v = inflater.inflate(R.layout.fragment_selection2, container, false);
    compositeDisposable = new CompositeDisposable();
    catidadproductos=(TextView)v.findViewById(R.id.cant_productoss);
    valortotal=(TextView)v.findViewById(R.id.total);
    recycler_cart = (RecyclerView)v.findViewById(R.id.recycler_cart3);
    recycler_cart.setLayoutManager(new LinearLayoutManager(getActivity()));
    recycler_cart.setHasFixedSize(true);
    initDB();
    loadCartItems();
    catidadproductos.setText(String.valueOf (Common.cartRepository.countCartItems()));
    valortotal.setText(String.valueOf(Common.cartRepository.sumPrice()));
    return v;
}

private void loadCartItems() {
    compositeDisposable.add(
            Common.cartRepository.getCartItems()
                    .observeOn(AndroidSchedulers.mainThread())
                    .subscribeOn(Schedulers.io())
                    .subscribe(new Consumer<List<Cart>>() {
                        @Override
                        public void accept(List<Cart> carts) throws Exception {
                            displayCartItem(carts);
                        }
                    })
    );
}
private void displayCartItem(List<Cart> carts ) {
    Cartadapter2 cartadapter = new Cartadapter2(getActivity(),carts);
    recycler_cart.setAdapter(cartadapter);
}
 @Override
public void updateItemCount(boolean b) {
    Toast.makeText(getActivity(),"Datos de compra actualizados",Toast.LENGTH_SHORT).show();
}
private void initDB() {
    Common.edmtRoomDatabase = EDMTRoomDatabase.getInstance(getActivity());
    Common.cartRepository = CartRepository.getInstance(CartDataSource.getInstance(Common.edmtRoomDatabase.cartDAO()));
    Common.favoriteRepository = FavoriteRepository.getInstance(FavoriteDataSource.getInstance(Common.edmtRoomDatabase.favoriteDAO()));
}
}

and this is my adapter

 Actualizarvalor callback;
Context context;
List<Cart> cartList;
public Cartadapter2(Context context, List<Cart> cartList ) {
    this.context = context;
    this.cartList = cartList;
}
@NonNull
@Override
public CartViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    View itemView = LayoutInflater.from(context).inflate(R.layout.cart_item,parent,false);
    return new CartViewHolder(itemView);
}
@Override
public void onBindViewHolder(@NonNull final CartViewHolder holder, final int position) {
    Picasso.with(context)
            .load(cartList.get(position).link)
            .into(holder.img_product);
    holder.txt_product_name.setText(cartList.get(position).name);
    holder.descripcion.setText(cartList.get(position).descripcion);
    holder.id.setText(Integer.toString(cartList.get(position).id));
    holder.txt_price.setText(new StringBuilder("$").append(cartList.get(position).price));
    holder.txt_countervalue.setText(cartList.get(position).amount);
    holder.btPlus.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Cart tempObj = cartList.get(position);
            int number = Integer.parseInt(holder.txt_countervalue.getText().toString());
            number++;
            holder.txt_countervalue.setText(Integer.toString(number));
            callback.updateItemCount(true);
        }
    });
}
@Override
public int getItemCount() {
    return cartList.size();
}
class CartViewHolder extends RecyclerView.ViewHolder
{
   public ImageView img_product;
   public ImageView btPlus,btMinus;
   public TextView txt_product_name, txt_price,txt_countervalue, descripcion,id;
   public CartViewHolder(View itemView) {
        super(itemView);
        img_product = (ImageView)itemView.findViewById(R.id.img_product);
        txt_countervalue = (TextView)itemView.findViewById(R.id.counterValue);
        txt_product_name=(TextView)itemView.findViewById(R.id.txt_product_name);
        txt_price=(TextView)itemView.findViewById(R.id.txt_price);
        descripcion=(TextView)itemView.findViewById(R.id.txt_description);
        btPlus = (ImageView) itemView.findViewById(R.id.botonmas);
        btMinus = (ImageView) itemView.findViewById(R.id.botonmenos);
        id = (TextView) itemView.findViewById(R.id.idcartitem);
    }
}
}

I also created an interface,

public interface Actualizarvalor {
void updateItemCount(boolean b);
}

I can not make the callback in the onclick event of my'btnplus' on the adapter without changing my constructor, Please help with this topic, I got stuck in this and a few weeks.

MANY THANKS

    
asked by IGr135 30.10.2018 в 05:58
source

2 answers

1

In the adapter you still have to enter the callback in the constructor or a setter .

public Cartadapter2(Context context, List<Cart> cartList, Actualizarvalor callback) {
    this.context = context;
    this.cartList = cartList;
    this.callback = callback;
}

And in fragment .

private void displayCartItem(List<Cart> carts ) {
    Cartadapter2 cartadapter = new Cartadapter2(getActivity(),carts, this);
    recycler_cart.setAdapter(cartadapter);
}
    
answered by 30.10.2018 в 09:35
0

The callback is not initialized because it does not do anything, it is even possible to throw a NullPointerException, to avoid that you have to give it memory, in your Adapter you must add the following method:

public Cartadapter2 setActualizarValor(Actualizarvalor actualizarvalor){
    this.callback = actualizarvalor;
    return Cartadapter2.this;
}

And in your Fragment Selection2 edit the displayCardItem method:

private void displayCartItem(List<Cart> carts ) {
    Cartadapter2 cartadapter = new Cartadapter2(getActivity(),carts)
            .setActualizarValor(Selection2.this);
    recycler_cart.setAdapter(cartadapter);
}
    
answered by 30.10.2018 в 17:35