gpt4 book ai didi

java - RecyclerView .addTextChangedListener 给出多个位置

转载 作者:行者123 更新时间:2023-12-01 16:44:45 25 4
gpt4 key购买 nike

我正在尝试创建一个在每行中包含一个 EditText 的 RecyclerView。一旦文本更改,我希望它用 println 显示位置。它运行良好,直到我在主方法中运行 .notifyDataSetChanged() 。之后,即使只更改了一个 EditText,它也会打印多个位置。

@Override
public void onBindViewHolder(MyViewHolder holder, final int position) {
holder.etName.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {

}
@Override
public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
}
@Override
public void afterTextChanged(Editable editable) {
System.out.println(position);
}
});
}

之前:et0 更改 = I/System.out: 0 <- 正确

之后:et0 更改 = I/System.out: 2 AND I/System.out: 0 <- 错误

最佳答案

发生这种情况是因为每次 ViewHolder 与 View 绑定(bind)时都会添加一个新的 TextWatcher。 RecyclerView 正确回收了 ViewHolders,因此当它使用已创建的 ViewHolders 时,它只是添加一个新的 TextWatcher。

您可以通过在创建 ViewHolder 时注册 TextWatcher 来修改使用此方法的方式,这样您就不必处理连续监听器绑定(bind)。因此,在 ViewHolder 构造函数中,绑定(bind) EditText 后,您可以添加 TextWatcher,如下所示:

this.etName = root.findViewById(R.id.yourEtID); // I'm sure you're doing something very similar to this in your VH's constructor
this.etName.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {

}
@Override
public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
}
@Override
public void afterTextChanged(Editable editable) {
System.out.println(etName.getTag());
}
});

您会注意到,这次我使用了 etName.getTag() 来读取位置。这非常有帮助,因为现在您可以将 onBindViewHolder 修改为如下所示:

@Override
public void onBindViewHolder(MyViewHolder holder, final int position) {
holder.etName.setTag(position);
}

如果有任何不清楚的地方,请随时询问。

关于java - RecyclerView .addTextChangedListener 给出多个位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54234730/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com