android-studio - RecyclerView 对多行的影响,当它应该只影响一个时
问题描述
我得到了不同产品的recyclerview,每个产品都有数量的edittext,当我输入一种产品的数量时,不仅edittext填充,而且每增加一个11的倍数。
例如:我在第 1 篇文章的编辑文本中写了相同的数量,第 11 篇和第 22 篇中会出现相同的效果......就像在图片中一样。 这是我在第一个编辑文本中输入的 这是我在第 11 篇文章中找到的
这是文章类
public class Article {
public String désignation;
public int colis;
public double prix_unité;
public Article(String désignation, int colis, double prix_unité) {
this.désignation = désignation;
this.colis = colis;
this.prix_unité = prix_unité;
}
}
这是活动
articles = new ArrayList<>();
CreateArticles();
fab = findViewById(R.id.add);
linearLayout = findViewById(R.id.total);
total_global = findViewById(R.id.prix_global);
prix_global = 0;
recyclerView = this.findViewById(R.id.recycler_view);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
adapter = new MyAdapter(this, articles);
recyclerView.setAdapter(adapter);
和我的适配器
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyHolder> {
private ArrayList<Article> articles;
private Context context;
public static class MyHolder extends RecyclerView.ViewHolder{
TextView désignation;
TextView colis;
TextView prix_unité;
TextView total;
EditText quant;
public MyHolder(@NonNull View itemView) {
super(itemView);
désignation = itemView.findViewById(R.id.item_désignation);
colis = itemView.findViewById(R.id.item_colis);
prix_unité = itemView.findViewById(R.id.item_prix_unité);
total = itemView.findViewById(R.id.item_total);
quant = itemView.findViewById(R.id.item_quant);
}
}
public MyAdapter(Context context, ArrayList<Article> articles) {
this.context = context;
this.articles = articles;
}
@NonNull
@Override
public MyHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
return new MyHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.list_item, parent, false));
}
@Override
public void onBindViewHolder(@NonNull final MyHolder holder, final int position) {
holder.désignation.setText(articles.get(position).désignation);
if (articles.get(position).désignation.equals("")) {
holder.colis.setText("");
holder.prix_unité.setText("");
holder.quant.setVisibility(View.INVISIBLE);
} else {
holder.colis.setText("" + articles.get(position).colis);
holder.prix_unité.setText("" + articles.get(position).prix_unité);
}
holder.quant.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
if (!holder.quant.getText().toString().equals("")) {
int col = articles.get(position).colis;
double pu = articles.get(position).prix_unité;
int qua = Integer.parseInt(holder.quant.getText().toString());
double result = col * qua * pu;
MainActivity.prix_global -= result;
}
}
@RequiresApi(api = Build.VERSION_CODES.M)
@Override
public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
}
@RequiresApi(api = Build.VERSION_CODES.M)
@Override
public void afterTextChanged(Editable editable) {
if (holder.quant.getText().toString().equals("")) {
holder.total.setText("");
holder.désignation.setTextColor(context.getColor(android.R.color.darker_gray));
holder.colis.setTextColor(context.getColor(android.R.color.darker_gray));
holder.prix_unité.setTextColor(context.getColor(android.R.color.darker_gray));
} else {
int col = articles.get(position).colis;
double pu = articles.get(position).prix_unité;
int qua = Integer.parseInt(holder.quant.getText().toString());
double result = col * qua * pu;
holder.total.setText("" + result);
holder.désignation.setTextColor(Color.BLACK);
holder.colis.setTextColor(Color.BLACK);
holder.prix_unité.setTextColor(Color.BLACK);
MainActivity.prix_global += result;
}
MainActivity.Total();
}
});
}
@Override
public int getItemCount(){
return articles.size();
}
}
解决方案
不一致可能是因为 editText 观察者设置在 中onBindViewHolder()
,相反我建议您在MyHolder
类的构造函数中设置观察者。
这样做并使MyHolder
类非静态,并TextWatcher
从以下位置删除代码onBindViewHolder()
:
public class MyHolder extends RecyclerView.ViewHolder{
TextView désignation;
TextView colis;
TextView prix_unité;
TextView total;
EditText quant;
public MyHolder(@NonNull View itemView) {
super(itemView);
désignation = itemView.findViewById(R.id.item_désignation);
colis = itemView.findViewById(R.id.item_colis);
prix_unité = itemView.findViewById(R.id.item_prix_unité);
total = itemView.findViewById(R.id.item_total);
quant = itemView.findViewById(R.id.item_quant);
//here set the text watchers on the quant:
quant.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
if (!quant.getText().toString().equals("")) {
int col = articles.get(getAdapterPosition()).colis;
double pu = articles.get(getAdapterPosition()).prix_unité;
int qua = Integer.parseInt(quant.getText().toString());
double result = col * qua * pu;
MainActivity.prix_global -= result;
}
}
@RequiresApi(api = Build.VERSION_CODES.M)
@Override
public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
}
@RequiresApi(api = Build.VERSION_CODES.M)
@Override
public void afterTextChanged(Editable editable) {
if (quant.getText().toString().equals("")) {
total.setText("");
désignation.setTextColor(context.getColor(android.R.color.darker_gray));
colis.setTextColor(context.getColor(android.R.color.darker_gray));
prix_unité.setTextColor(context.getColor(android.R.color.darker_gray));
} else {
int col = articles.get(getAdapterPosition()).colis;
double pu = articles.get(getAdapterPosition()).prix_unité;
int qua = Integer.parseInt(quant.getText().toString());
double result = col * qua * pu;
total.setText("" + result);
désignation.setTextColor(Color.BLACK);
colis.setTextColor(Color.BLACK);
prix_unité.setTextColor(Color.BLACK);
MainActivity.prix_global += result;
}
MainActivity.Total();
}
});
}
}
推荐阅读
- perl - 保留图像中的纵横比::Magick 的缩略图功能
- ruby-on-rails - Webpacker 编译失败 - 错误:[Errno 21] 是目录:'bin'
- swift - SwiftUI TextField 键盘闪烁并中断其他语言的输入
- reactjs - 错误:仅在构建电子应用程序时发生写入 EPIPE
- node.js - 如何使用 Cors 或任何其他节点模块限制对我的 graphql 端点的访问
- python - 运行一个简单的 pdblp 代码来提取 BBG 数据
- sql - Kafka Connect JDBC 与 Debezium CDC
- html - 如何为标题中的每个符号设置样式
- javascript - Nodejs http.createServer 回调
- powershell - 解析 RSS,如果日期与当前日期匹配,则继续下载