自定义适配器中 EditText 的文本更改侦听器

Text Change Listener for EditText in custom adapter

在我的 android 应用程序中,我有带 EditTexts 的列表视图。更改 EditText 值后,我将新值存储在 afterTextChanged 中的 ArrayList 中。但是在仅编辑一个字段后出现了一些工作错误,ArrayList 获得了具有相同编辑字符串的多个项目。我如何才能让 ArrayList 只为每个字段获取一次已编辑的字符串?

class MyListViewAdapter extends ArrayAdapter<KeyValueList>
{
private int layoutResource;

MyListViewAdapter(Context context, int layoutResource, List<KeyValueList> keyValueList)
{
    super(context, layoutResource, keyValueList);
    this.layoutResource = layoutResource;
}

@Override
public View getView(final int position, final View convertView, @NonNull ViewGroup parent)
{
    View view = convertView;
    if (view == null)
    {
        LayoutInflater layoutInflater = LayoutInflater.from(getContext());
        view = layoutInflater.inflate(layoutResource, null);
    }

    final KeyValueList keyValuelist = getItem(position);

    if (keyValuelist != null)
    {
        TextView key = (TextView) view.findViewById(R.id.key);
        EditText value = (EditText) view.findViewById(R.id.value);
        ImageView image = (ImageView) view.findViewById(R.id.img);

        value.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)
            {
                HashMap<String, String> edit = new HashMap<>();

                edit.put("string", s.toString());

                openEntry.edit_list.add(edit);
            }
        });
....
}

如果您使用 setTextChangedListener(如果存在),或者在添加新视图之前从视图中删除所有 TextChangedListener,它可能会起作用。

这些视图已被回收,但您一直在向它们添加新的侦听器。我认为这可能是问题所在。

我也遇到了类似的问题,通过将EditText设置为final并检查条件hasFocus()

解决了
final EditText value = (EditText) view.findViewById(R.id.value);
...
@Override
public void afterTextChanged(Editable s)
{

   if(value.hasFocus()){
        HashMap<String, String> edit = new HashMap<>();
        edit.put("string", s.toString());
        openEntry.edit_list.add(edit);
   }

}

这可能会对遇到同样问题的人有所帮助