Android RecyclerView TextView无需点击实时更新值问题求助
搞定TextView初始不显示+值变不更新的问题
嘿,看你的代码和描述,你现在卡在两个点上:一是mTextprix一开始不显示价格,非得点一下Item才出来;二是价格变了之后,TextView还抱着旧值不放,还是得点Item才更新。这俩问题其实都是Adapter的刷新逻辑和文本设置的小问题,咱们一步步解决:
先说说为啥会这样
- 初始不显示:很大概率是你直接把非字符串类型的
calculate_item_price传给setText()了——Android会把这个数值当成资源ID去查,找不到就显示空。另外如果初始时这个变量还没被赋值,自然也显示不出来。 - 值变不更新: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
相关产品推荐
相关产品推荐

