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

如何通过RecyclerView删除按钮修改Activity的TextView及sumCost值?

实现删除条目时更新总计金额的解决方案

要实现点击Delete按钮时扣除对应条目金额并更新总计显示,需要从数据模型、Adapter回调、Activity逻辑三个层面调整,具体方案如下:

1. 优化Contact数据模型

将mCost改为double类型,避免字符串转数值的额外开销和潜在错误,同时提供显示用的字符串转换方法:

public class Contact {
    private String mName;
    private double mCost;

    public Contact(String name, double cost) {
        mName = name;
        mCost = cost;
    }

    public String getName() {
        return mName;
    }

    public double getCost() {
        return mCost;
    }

    // 用于TextView显示的格式化字符串方法
    public String getCostString() {
        return Double.toString(mCost);
    }
}

2. 给Adapter添加删除回调接口

让Adapter能通知MainActivity删除事件,传递被删除的条目数据:

public class ContactsAdapter extends RecyclerView.Adapter<ViewHolder>{

    // 定义删除回调接口
    public interface OnItemDeleteListener {
        void onItemDelete(Contact deletedContact);
    }

    private OnItemDeleteListener mDeleteListener;
    List<Contact> mContacts;

    // 构造方法增加回调参数
    public ContactsAdapter(List<Contact> contacts, OnItemDeleteListener deleteListener) {
        mContacts = contacts;
        mDeleteListener = deleteListener;
    }

    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        Context context = parent.getContext();
        LayoutInflater inflater = LayoutInflater.from(context);
        View contactView = inflater.inflate(R.layout.item_contact, parent, false);
        return new ViewHolder(contactView).linkAdapter(this);
    }

    @NonNull
    @Override
    public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
        Contact contact = mContacts.get(position);
        holder.nameId.setText(contact.getName());
        holder.nameCost.setText(contact.getCostString());
    }

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

    // 触发删除逻辑并通知外部
    public void triggerDelete(int position) {
        Contact deletedContact = mContacts.get(position);
        mContacts.remove(position);
        notifyItemRemoved(position);
        if (mDeleteListener != null) {
            mDeleteListener.onItemDelete(deletedContact);
        }
    }
}

class ViewHolder extends RecyclerView.ViewHolder {
    private ContactsAdapter adapter;
    public TextView nameId;
    public TextView nameCost;

    public ViewHolder(@NonNull View itemView) {
        super(itemView);
        nameId = itemView.findViewById(R.id.text);
        nameCost = itemView.findViewById(R.id.textCost);

        itemView.findViewById(R.id.delete).setOnClickListener(view -> {
            adapter.triggerDelete(getAdapterPosition());
        });
    }

    public ViewHolder linkAdapter(ContactsAdapter adapter){
        this.adapter = adapter;
        return this;
    }
}

3. 优化MainActivity逻辑

初始化Adapter时绑定回调,修改AddItem方法避免重复创建Adapter,处理删除回调更新总计金额:

public class MainActivity extends AppCompatActivity implements ContactsAdapter.OnItemDeleteListener {

    TextView sumText;
    Button buttonAdd;
    List<Contact> contacts = new LinkedList<>();
    ContactsAdapter adapter;

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

        buttonAdd = findViewById(R.id.scanBtn);
        sumText = findViewById(R.id.SumText);

        // 仅初始化一次RecyclerView和Adapter
        RecyclerView rvContacts = findViewById(R.id.recyclerView);
        adapter = new ContactsAdapter(contacts, this);
        rvContacts.setAdapter(adapter);
        rvContacts.setLayoutManager(new LinearLayoutManager(this));

        buttonAdd.setOnClickListener(view -> {
            AddItem("Tom", 2.45);
            updateSumText();
        });
    }

    public void AddItem(String name, double cost){
        sumCost += cost;
        contacts.add(new Contact(name, cost));
        // 高效更新列表,仅通知新增条目
        adapter.notifyItemInserted(contacts.size() - 1);
    }

    public double sumCost = 0;

    // 更新总计显示的通用方法,确保格式统一
    private void updateSumText() {
        sumText.setText(String.format("%.2f", sumCost));
    }

    // 实现删除回调,更新总计金额
    @Override
    public void onItemDelete(Contact deletedContact) {
        sumCost -= deletedContact.getCost();
        updateSumText();
    }
}

额外优化说明

  • 用String.format("%.2f", sumCost)确保金额显示两位小数,提升用户体验
  • 避免每次添加条目都重复创建Adapter和LayoutManager,减少性能损耗
  • 用notifyItemInserted和notifyItemRemoved替代全局刷新,实现更流畅的列表动画

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 00:09:24