从Recyclerview适配器类更新textview

时间:2018-07-01 00:15:39

标签: java android android-recyclerview e-commerce

我正在开发一个电子商务应用程序,以下一些在线订单。在我的Recyclerview中有一些产品,它们是在上一个活动中添加的。在这里,我在Recyclerview中用产品名称,数量,价格等详细信息填充了添加的产品。有一些按钮可以增加/减少每种产品的数量,还有一个按钮也可以删除该项目。

在Recyclerview布局的底部,还有另一个textview用于显示总计。当我在处理RecyclerViewAdapter类中的按钮时,当用户更新数量或删除项目时,我必须更新总计。我尝试了这里已经提到的一些解决方案,但是该应用程序在随机单击按钮时崩溃。请提供解决方案或更好的方法。

这是我的适配器类:

public class InvoiceRecyclerViewAdapter extends RecyclerView.Adapter<InvoiceRecyclerViewAdapter.ViewHolder> {
    private static final String TAG = "RecylerViewAdapter";

    List<Products> addedProductsList;
    Context mContext;


    public InvoiceRecyclerViewAdapter(Context mContext,List<Products> addedProductsList)
    {
        this.mContext=mContext;
        this.addedProductsList=addedProductsList;

    }
    public InvoiceRecyclerViewAdapter(Context mContext)
    {
        this.mContext=mContext;
    }

    @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);
        return viewHolder;
    }

    @Override
    public void onBindViewHolder(@NonNull final ViewHolder holder, final int position) {

        holder.item_qty.setText("1");
        holder.itemname.setText(addedProductsList.get(position).getName());
        holder.itemprice.setText("Rs "+addedProductsList.get(position).getPrice());
        holder.itemdiscount.setText("Rs "+calculate_dis(position));
        holder.itemtotal.setText("Rs "+calculate_total(position));


        holder.button_inc.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                int qty = addedProductsList.get(position).getQty();
                qty++;
                addedProductsList.get(position).setQty(qty);
                holder.item_qty.setText(""+qty);
                holder.itemdiscount.setText("Rs "+calculate_dis(position));
                holder.itemtotal.setText("Rs "+calculate_total(position));

                UpdateTotal();

            }
        });

        holder.button_dec.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                int qty = addedProductsList.get(position).getQty();
                qty--;
                if(qty>0){
                    addedProductsList.get(position).setQty(qty);
                    holder.item_qty.setText(""+qty);
                    holder.itemdiscount.setText("Rs"+calculate_dis(position));
                    holder.itemtotal.setText("Rs"+calculate_total(position));

                    UpdateTotal();
                }

            }
        });

        holder.button_cancel.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                addedProductsList.get(position).setAddedTocart(false);
                //notifyDataSetChanged();
                addedProductsList.remove(position);
                notifyItemRemoved(position);

                UpdateTotal();
            }
        });
    }

    @Override
    public int getItemCount() {
        return addedProductsList.size();
    }


    public class ViewHolder extends RecyclerView.ViewHolder{

        TextView itemname,itemtotal,itemprice,itemdiscount,item_qty;
        Button button_cancel,button_inc,button_dec;
        ConstraintLayout parent_layout;

        public ViewHolder(View itemView) {
            super(itemView);
            itemname = itemView.findViewById(R.id.textView_item_name);
            itemprice = itemView.findViewById(R.id.textView_item_price);
            itemdiscount = itemView.findViewById(R.id.textView_item_discount);
            itemtotal = itemView.findViewById(R.id.textView_item_total);
            button_cancel = itemView.findViewById(R.id.button_cancel);
            button_inc=itemView.findViewById(R.id.button_inc);
            button_dec=itemView.findViewById(R.id.button_dec);
            item_qty = itemView.findViewById(R.id.textView_qty);
            parent_layout = itemView.findViewById(R.id.invoice_parent_layout);

        }
    }

    private float calculate_dis(int pos){
        float dis = 0;
        if(addedProductsList.get(pos).isPrice_g_enabled()){
            int qty=addedProductsList.get(pos).getQty();
            dis = Float.parseFloat(addedProductsList.get(pos).getPrice())-Float.parseFloat(addedProductsList.get(pos).getPrice_g());
            dis = qty*dis;
        }
        return dis;


    }
    private float calculate_total(int pos){
        int qty=addedProductsList.get(pos).getQty();
        float price,total;
        if(addedProductsList.get(pos).isPrice_g_enabled()){
            price = Float.parseFloat(addedProductsList.get(pos).getPrice_g());
        }
        else{
            price= Float.parseFloat(addedProductsList.get(pos).getPrice());
        }

        total = price*qty;
        return total;
    }
    private void UpdateTotal(){

        TextView txtView =((EditQuantity)mContext).findViewById(R.id.textView_total);

        float total=0,price=0;
        int qty=0;
        for(int i=0;i<addedProductsList.size();i++){
            if(addedProductsList.get(i).isAddedTocart()) {
                qty = addedProductsList.get(i).getQty();
                if(addedProductsList.get(i).isPrice_g_enabled()){
                    price = Float.parseFloat(addedProductsList.get(i).getPrice_g());
                }
                else{
                    price= Float.parseFloat(addedProductsList.get(i).getPrice());
                }

            }
            total=total+(qty*price);
        }
        txtView.setText("Rs "+total);
    }
}

这是“主要活动”部分:

public class EditQuantity extends AppCompatActivity {

    ArrayList<Products> products_list;
    ArrayList<Products> cart_productslist= new ArrayList<>();
    Products added_product;
    FloatingActionButton fab_next;
    TextView total_textview;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_edit_quantity);

        products_list = getIntent().getParcelableArrayListExtra("products");
        Products products;
        for(int i=0;i<products_list.size();i++){
            products = products_list.get(i);
            if(products.isAddedTocart()){
                added_product = new Products(products.getName(),products.getPrice(),products.getPrice_g(),products.getImage(),1,true,products.isPrice_g_enabled());

                cart_productslist.add(added_product);
            }

        }

        Toolbar toolbar = findViewById(R.id.toolbar_invoice);
        setSupportActionBar(toolbar);
        getSupportActionBar().setTitle("Cart");

        total_textview = findViewById(R.id.textView_total);
        total_textview.setText("Rs "+CalTotal());


        fab_next = findViewById(R.id.fab_next);
        fab_next.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
                        .setAction("Action", null).show();
            }
        });

        InitRecylerView();
    }

    @Override
    public void onBackPressed() {

    }

    private void InitRecylerView() {
        RecyclerView recyclerView = findViewById(R.id.invoice_recyclerview);
        InvoiceRecyclerViewAdapter adapter = new InvoiceRecyclerViewAdapter(
                this ,cart_productslist);
        recyclerView.setAdapter(adapter);
        recyclerView.setLayoutManager(new LinearLayoutManager(this));

    }

    public float CalTotal(){
        float total=0;
        float i_total,price;
        for(int i=0;i<cart_productslist.size();i++){
            if(cart_productslist.get(i).isAddedTocart()) {
                int qty = cart_productslist.get(i).getQty();
                if(cart_productslist.get(i).isPrice_g_enabled()){
                    price = Float.parseFloat(cart_productslist.get(i).getPrice_g());
                }
                else{
                    price= Float.parseFloat(cart_productslist.get(i).getPrice());
                }
                i_total = price * qty;
                total = total + i_total;
            }
        }
        return total;
    } 

1 个答案:

答案 0 :(得分:2)

我建议您通过一个侦听器,移动您的onClickListeners并删除for循环。

所以,一步一步

在您的适配器类中声明一个接口

SELECT b1.*
FROM batteries b1
INNER JOIN
(
    SELECT BatteryID, MAX(Date) AS max_date
    FROM batteries
    WHERE type = 'NiMh AA'
    GROUP BY BatteryID
) b2
    ON b1.BatteryID = b2.BatteryID AND b1.Date = b2.max_date
WHERE
    b1.type = 'NiMh AA';

接下来,将一个私有的OnQuantityChangeListener添加到您的适配器类,并更改构造函数以在创建时添加一个:

public interface OnQuantityChangeListener {
    void onQuantityChange( float change );
}

在onBindViewHolder方法中设置OnClickListeners对性能不利,因为这意味着您必须在视图弹出到屏幕上时添加它们。而是在onCreateViewHolder方法中设置它们,那样您将对其进行回收。要获取当前项目,可以使用 getAdapterPosition()方法。

因此,在 onCreateViewHolder 方法中设置侦听器:

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;
}

此时请记住要从 onBindViewHolder 方法中删除OnClickListeners。

完成此操作后,转到您的活动并添加私人总计:

@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;
}

并像这样编辑适配器的创建:

private float total = 0;

然后就可以了。记住要一次计算您的活动中的第一个总数(这里不要转义for循环),然后确保保存实例状态。

希望这会有所帮助!