自定义适配器中 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);
}
}
这可能会对遇到同样问题的人有所帮助
在我的 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);
}
}
这可能会对遇到同样问题的人有所帮助