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
相关产品推荐
相关产品推荐

