You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android开发:如何在RecyclerView Adapter计算单价×数量并在Activity获取总价

实现方案

1. 调整AdapterDataPembelian代码

需要做三处核心修改:

  • 新增总价变化监听接口,用于向Activity同步价格变动
  • 完善getTotalPrice()方法的计算逻辑
  • 商品数量加减操作完成后触发监听回调

修改后的核心代码如下:

public class AdapterDataPembelian extends RecyclerView.Adapter<AdapterDataPembelian.HolderDataPembelian>{
    private Context ctx;
    private List<DataModel> listDataPembelian;
    private OnTotalPriceChangeListener priceChangeListener; // 新增监听成员

    // 定义总价变化监听接口
    public interface OnTotalPriceChangeListener {
        void onPriceUpdate(int totalPrice);
    }

    // 构造方法新增监听参数
    public AdapterDataPembelian(Context ctx, List<DataModel> listDataPembelian, OnTotalPriceChangeListener listener) {
        this.ctx = ctx;
        this.listDataPembelian = listDataPembelian;
        this.priceChangeListener = listener;
    }

    // 其余原有代码保持不变...

    private void plusCartItem(HolderDataPembelian holder, DataModel dataModel) {
        dataModel.setQuantity(dataModel.getQuantity()+1);
        holder.jmlBarang.setText(String.valueOf(dataModel.getQuantity()));
        // 新增:触发总价更新回调
        if (priceChangeListener != null) {
            priceChangeListener.onPriceUpdate(getTotalPrice());
        }
    }

    private void minusCartItem(HolderDataPembelian holder, DataModel dataModel) {
        if (dataModel.getQuantity() > 0){
            dataModel.setQuantity(dataModel.getQuantity()-1);
        }
        holder.jmlBarang.setText(String.valueOf(dataModel.getQuantity()));
        // 新增:触发总价更新回调
        if (priceChangeListener != null) {
            priceChangeListener.onPriceUpdate(getTotalPrice());
        }
    }

    // 完善总价计算方法
    public int getTotalPrice(){
        int totalPrice = 0;
        for (int i=0; i<listDataPembelian.size(); i++){
            DataModel item = listDataPembelian.get(i);
            totalPrice += item.getQuantity() * item.getHarga();
        }
        return totalPrice;
    }

    // 其余原有代码保持不变...
}

2. 调整PembelianActivity代码

需要实现监听接口、格式化展示总价:

  • 新增印尼盾格式化工具方法(复用Adapter已有逻辑)
  • 初始化Adapter时传入监听实现,接收总价更新后刷新页面展示
  • 数据首次加载完成后先渲染初始总价

修改后的核心代码如下:

public class PembelianActivity extends AppCompatActivity {
    // 将原有泛型Adapter改为具体类型,方便调用getTotalPrice方法
    private AdapterDataPembelian adData;
    // 其余原有成员变量保持不变...

    // 新增格式化工具方法
    private String formatRupiah(Double number){
        Locale localeID = new Locale("IND", "ID");
        NumberFormat numberFormat = NumberFormat.getCurrencyInstance(localeID);
        String formatRupiah = numberFormat.format(number);
        String[] split = formatRupiah.split(",");
        int length = split[0].length();
        return split[0].substring(0,2)+". "+split[0].substring(2,length);
    }

    // 其余原有代码保持不变...

    public void retrieveData(){
        pbData.setVisibility(View.VISIBLE);
        APIRequestData ardData = RetroServer.konekRetrofit().create(APIRequestData.class);
        Call<ResponseModel> tampildata = ardData.ardRetrieveData();

        tampildata.enqueue(new Callback<ResponseModel>() {
            @Override
            public void onResponse(Call<ResponseModel> call, Response<ResponseModel> response) {
                int kode = response.body().getKode();
                String pesan = response.body().getPesan();

                listDataPembelian = response.body().getData();
                // 初始化Adapter时传入监听实现
                adData = new AdapterDataPembelian(PembelianActivity.this, listDataPembelian, new AdapterDataPembelian.OnTotalPriceChangeListener() {
                    @Override
                    public void onPriceUpdate(int totalPrice) {
                        // 收到价格更新后格式化展示
                        totalHarga.setText(formatRupiah((double) totalPrice));
                    }
                });
                rvData.setAdapter(adData);
                adData.notifyDataSetChanged();
                // 首次加载完成后渲染初始总价
                totalHarga.setText(formatRupiah((double) adData.getTotalPrice()));

                pbData.setVisibility(View.INVISIBLE);
            }

            @Override
            public void onFailure(Call<ResponseModel> call, Throwable t) {
                Toast.makeText(PembelianActivity.this, "Gagal Menghubungi Server", Toast.LENGTH_SHORT).show();
                pbData.setVisibility(View.INVISIBLE);
            }
        });
    }

    // 其余原有代码保持不变...
}

注意事项

  • 如果DataModel中的harga为String类型,计算前需要先转换为数字类型
  • 对计算精度要求高的场景可以改用BigDecimal完成价格计算,避免浮点精度丢失
  • 商品数量修改后必须同步更新DataModel中的quantity值,保证计算数据源统一

内容的提问来源于stack exchange,提问作者Fadil Mahri

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 17:27:03