首页 > 解决方案 > 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();
}

}

标签: android-studioandroid-recyclerview

解决方案


不一致可能是因为 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();
    }

});



}
}

推荐阅读