Edittext textwatcher触发listview中的所有editexts

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Edittext textwatcher触发listview中的所有editexts相关的知识,希望对你有一定的参考价值。

我有一个listview,其中包含每个位置的edittext。我为每个edittext分配了一个textwatcher,如下所示:

holder.prodQuantity.addTextChangedListener(new TextWatcher() {
    @Override
    public void beforeTextChanged(CharSequence s, int start, int count, int after) {

    }

    @Override
    public void onTextChanged(CharSequence s, int start, int before, int count) {
    }

    @Override
    public void afterTextChanged(Editable s) {
        if(isDialog) {
            recallMap.put(productId, s.toString());
        }
    }

这里的问题是,每当我向第一个编辑文本添加值时,文本观察者就会触发列表视图的所有项目。 recallMap应该只包含所选行的id和在该行的编辑文本中输入的值,但在这种情况下,recalMap具有所有id和在第一个编辑文本中输入的值。请注意,这是在没有任何滚动的情况下发生的。任何帮助将非常感激。谢谢。

答案

在适配器中添加textChangedListner之前,先删除已添加的textChangedListener到该EditText。喜欢

 holder.prodQuantity.removeTextChangedListener(textWatcher);
 // obviously you also need to maintain TextWatchers ArrayList associated with each EditText.
// Or instead of maintaining a separate ArrayList for TextWatcher, you can implement in your Data Model Class.

然后你的代码如下

  holder.prodQuantity.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {

}

@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
}

@Override
public void afterTextChanged(Editable s) {
    if(isDialog) {
        recallMap.put(productId, s.toString());
    }
}
另一答案

使用此自定义类

public class MyCustomEditTextListener implements TextWatcher {
        private int position;

        public void updatePosition(int position) {
            this.position = position;
        }

        @Override
        public void beforeTextChanged(CharSequence charSequence, int i, int i2, int i3) {
        }

        @Override
        public void onTextChanged(CharSequence charSequence, int i, int i2, int i3) {
        }

        @Override
        public void afterTextChanged(Editable editable) {
           //your edittext text is here
        }
    }

 @Override
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.layout, parent, false);
        return new ViewHolder(v, new MyCustomEditTextListener(), this);
    }

将侦听器分配给edittext

edittext.addTextChangedListener(myCustomEditTextListener);

更新清单位置

@Override
    public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
            holder.myCustomEditTextListener.updatePosition(position);
    }

以上是关于Edittext textwatcher触发listview中的所有editexts的主要内容,如果未能解决你的问题,请参考以下文章

带有TextWatcher和LiveData的EditText中的光标位置?

当TextWatcher存在时退格/删除时按EditText光标位置

如何使用 TextWatcher Android 将 3 位小数货币格式添加到edittext

在 EditText 上使用 TextWatcher 在 android 中实时计算总数和总和?

Android开发中给EditText控件添加TextWatcher监听实现对输入字数的限制

android TextWatcher 更改外部类私有字段