Я бы посоветовал пройти через слушателя, переместить ваши onClickListener и удалить циклы for.
Итак, шаг за шагом
В вашем классе адаптеров объявите интерфейс
public interface OnQuantityChangeListener {
void onQuantityChange( float change );
}
Затем добавьте приватный OnQuantityChangeListener в ваш класс адаптера и измените конструктор, добавив его при создании:
private OnQuantityChangeListener mListener;
public InvoiceRecyclerViewAdapter(Context mContext,List<Products> addedProductsList, OnQuantityChangeListener listener) {
this.mContext=mContext;
this.addedProductsList=addedProductsList;
mListener = listener;
}
public InvoiceRecyclerViewAdapter(Context mContext, OnQuantityChangeListener listener)
{
this.mContext=mContext;
mListener = listener;
}
Плохо для производительности устанавливать OnClickListeners в методе onBindViewHolder, потому что это означает, что вам придется добавлять их в любое время, когда представление появляется на экране. Вместо этого установите их в методе onCreateViewHolder, чтобы их можно было перерабатывать. Чтобы получить текущий элемент, вы можете использовать метод getAdapterPosition () .
Итак, в методе onCreateViewHolder установите слушателей:
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.layout_invoice,parent,false);
ViewHolder viewHolder = new ViewHolder(view);
viewHolder.button_inc.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Products product = addedProductsList.get(getAdapterPosition());
product.setQty( product.getQty() + 1 );
float difference = product.isPrice_g_enabled() ? Float.parseFloat(product.getPrice_g()) : Float.parseFloat(product.getPrice());
mListener.onQuantityChange( difference );
notifyItemChanged( getAdapterPosition ):// This will call onBindViewAdapter again and change all your strings for you
}
});
viewHolder.button_dec.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Products product = addedProductsList.get(getAdapterPosition());
if( product.getQty() == 0 )// Can't remove an item if it's already at 0
return;
product.setQty( product.getQty() - 1 );
float difference = product.isPrice_g_enabled() ? Float.parseFloat(product.getPrice_g()) : Float.parseFloat(product.getPrice());
mListener.onQuantityChange( -difference );
notifyItemChanged( getAdapterPosition ):// This will call onBindViewAdapter again and change all your strings for you
}
});
viewHolder.button_cancel.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Products product = addedProductsList.get(getAdapterPosition());
float difference = product.isPrice_g_enabled() ? Float.parseFloat(product.getPrice_g()) : Float.parseFloat(product.getPrice());
mListener.onQuantityChange( -difference * product.getQty() );
product.setQty( 0 );
notifyItemChanged( getAdapterPosition ):// This will call onBindViewAdapter again and change all your strings for you
// You decide at this point if you want to remove the item altogether or just show 0
}
});
return viewHolder;
}
Не забудьте в этот момент удалить OnClickListeners из вашего onBindViewHolder метода.
Как только это будет сделано, зайдите в свою активность и добавьте личный итог:
private float total = 0;
и отредактируйте создание адаптера следующим образом:
InvoiceRecyclerViewAdapter adapter = new InvoiceRecyclerViewAdapter(
this ,cart_productslist, new InvoiceRecyclerViewAdapter.OnQuantityChangeListener(){
@Override
void onQuantityChange( float difference ){
total += difference;
total_textview.setText("Rs "+ total);
}
} );
И это делает. Не забудьте рассчитать свой первый итог в своей активности один раз (без выхода из цикла for здесь), а затем убедитесь, что вы сохранили свои экземпляры.
Надеюсь, это поможет!