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

Android RecyclerView TextView无需点击实时更新值问题求助

搞定TextView初始不显示+值变不更新的问题

嘿,看你的代码和描述,你现在卡在两个点上:一是mTextprix一开始不显示价格,非得点一下Item才出来;二是价格变了之后,TextView还抱着旧值不放,还是得点Item才更新。这俩问题其实都是Adapter的刷新逻辑和文本设置的小问题,咱们一步步解决:

先说说为啥会这样

  1. 初始不显示:很大概率是你直接把非字符串类型的calculate_item_price传给setText()了——Android会把这个数值当成资源ID去查,找不到就显示空。另外如果初始时这个变量还没被赋值,自然也显示不出来。
  2. 值变不更新:Adapter根本不知道calculate_item_price变了啊!只有你点击Item触发notifyDataSetChanged()的时候,它才会重新走一遍onBindViewHolder()去更新UI,所以价格变了它也没反应。

具体怎么改

1. 先让初始价格显示出来

把onBindViewHolder()里设置价格的那行代码改一下,确保把数值转成字符串再给TextView:

// 假设calculate_item_price是BigDecimal(看你Utils里的round方法返回这个),直接转成字符串
holder.mTextprix.setText(CustomerMapActivity.calculate_item_price.toString());

// 如果是float类型,先转成BigDecimal再处理:
// BigDecimal roundedPrice = new Utils().round(CustomerMapActivity.calculate_item_price, 2);
// holder.mTextprix.setText(roundedPrice.toString());

这样只要初始时calculate_item_price有合法值,TextView一加载就会显示价格,不用等点击。

2. 让价格变了自动更新

给你的TypeAdapter加个专门更新价格的方法,以后价格变了就调用这个方法,让Adapter自己刷新:

public class TypeAdapter extends RecyclerView.Adapter<TypeAdapter.viewHolders> {
    // ... 你原来的代码都保留 ...

    // 新增:更新价格并通知Adapter刷新UI
    public void updateItemPrice(String newPrice) {
        // 这里根据calculate_item_price的实际类型调整,比如是BigDecimal就转一下
        CustomerMapActivity.calculate_item_price = new BigDecimal(newPrice);
        // 通知Adapter所有Item刷新,这里因为所有Item都显示同一个价格,所以没问题
        notifyDataSetChanged();
    }

    // ... 原来的代码继续 ...
}

然后在CustomerMapActivity里,每次计算完新价格之后,调用这个方法:

// 假设你的TypeAdapter实例叫typeAdapter
// 先算出新价格,比如用Utils处理一下
BigDecimal newCalculatedPrice = new Utils().round(你的计算逻辑, 2);
// 调用Adapter的方法更新
typeAdapter.updateItemPrice(newCalculatedPrice.toString());

这样价格一变,Adapter就会立刻刷新所有Item的价格显示,不用再点Item啦。

3. 可选:确保初始价格正确

如果你的初始价格是在Adapter初始化之后才计算出来的,那初始化完Adapter之后,记得再调用一次updateItemPrice()把初始价格传进去,保证一开始就显示正确:

// 在CustomerMapActivity里初始化Adapter
List<TypeObject> typeList = Utils.getTypeList(this);
TypeAdapter typeAdapter = new TypeAdapter(typeList, this);
// 等初始价格计算完成后
BigDecimal initialPrice = // 你的初始价格计算逻辑
typeAdapter.updateItemPrice(initialPrice.toString());
// 再设置给RecyclerView
recyclerView.setAdapter(typeAdapter);

修改后的完整Adapter代码

public class TypeAdapter extends RecyclerView.Adapter<TypeAdapter.viewHolders> {
    private Context context;
    private TypeObject selectedItem;
    private List<TypeObject> itemArrayList;

    public TypeAdapter(List<TypeObject> itemArrayList, Context context) {
        this.itemArrayList = itemArrayList;
        selectedItem = itemArrayList.get(0);
        this.context = context;
    }

    @Override
    public TypeAdapter.viewHolders onCreateViewHolder(ViewGroup parent, int viewType) {
        View layoutView = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_type, null, false);
        RecyclerView.LayoutParams lp = new RecyclerView.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
        layoutView.setLayoutParams(lp);
        return new viewHolders(layoutView);
    }

    @Override
    public void onBindViewHolder(final @NonNull viewHolders holder, int position) {
        holder.mName.setText(itemArrayList.get(position).getName());
        holder.mPeople.setText(String.valueOf(itemArrayList.get(position).getPeople()));
        holder.mImage.setImageDrawable(itemArrayList.get(position).getImage());
        
        // 修复:把价格转成字符串再设置
        holder.mTextprix.setText(CustomerMapActivity.calculate_item_price.toString());

        if(selectedItem.equals(itemArrayList.get(position))){ 
            holder.mLayout.setBackgroundColor(context.getResources().getColor(R.color.colorAccent2));
        }else{
            holder.mLayout.setBackgroundColor(context.getResources().getColor(R.color.white));
        }

        holder.mLayout.setOnClickListener(v -> {
            selectedItem = itemArrayList.get(holder.getAdapterPosition());
            notifyDataSetChanged();
        });
    }

    // 新增的更新价格方法
    public void updateItemPrice(String updatedPrice) {
        CustomerMapActivity.calculate_item_price = new BigDecimal(updatedPrice);
        notifyDataSetChanged();
    }

    public TypeObject getSelectedItem() {
        return selectedItem;
    }

    public void setSelectedItem(TypeObject selectedItem) {
        this.selectedItem = selectedItem;
    }

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

    class viewHolders extends RecyclerView.ViewHolder {
        TextView mName, mPeople, mTextprix;
        ImageView mImage;
        LinearLayout mLayout;

        viewHolders(View itemView) {
            super(itemView);
            mImage = itemView.findViewById(R.id.image);
            mPeople = itemView.findViewById(R.id.people);
            mName = itemView.findViewById(R.id.name);
            mLayout = itemView.findViewById(R.id.layout);
            mTextprix = itemView.findViewById(R.id.prixprix);
        }
    }
}

提醒一下:如果calculate_item_price是float类型,记得用Utils的round方法处理后再转字符串,不然小数位会很乱哦。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 07:57:42