Android 编辑ListView滚动上的文本内容更改

Android 编辑ListView滚动上的文本内容更改,android,android-layout,android-widget,Android,Android Layout,Android Widget,我有一个Android应用程序,它带有一个自定义适配器,扩展了游标适配器。 我重写了CursorAdapter的bindView和newview方法。我的每个ListView行都包含一个EditText。当我在EditText中输入一些文本并向下滚动列表视图时,EditText文本的内容将移动到另一个EditText 有人能帮我解决这个问题吗?当ListView向下滚动时,如何防止EditText重用其内容 提前感谢, 以下是代码: private class AddScree

我有一个Android应用程序,它带有一个自定义适配器,扩展了游标适配器。
我重写了CursorAdapter的bindView和newview方法。我的每个ListView行都包含一个EditText。当我在EditText中输入一些文本并向下滚动列表视图时,EditText文本的内容将移动到另一个EditText
有人能帮我解决这个问题吗?当ListView向下滚动时,如何防止EditText重用其内容


提前感谢,


以下是代码:

        private class AddScreenArrayAdapter extends ArrayAdapter<AddScreenItems>{

  ViewHolder viewHolder = null;
  public String[] holder_values;

public AddScreenArrayAdapter(Context context, int textViewResourceId,
        List<AddScreenItems> objects) {
    super(context, textViewResourceId, objects);
    holder_values = new String[objects.size()];

    // TODO Auto-generated constructor stub
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    // TODO Auto-generated method stub

    View v = convertView;
    if (v == null) {
        LayoutInflater vi = (LayoutInflater)getActivity().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        v = vi.inflate(R.layout.additem_row, null);
        viewHolder = new ViewHolder();
        viewHolder.label = (TextView) v.findViewById(R.id.label_add_item);
        viewHolder.dbName=(TextView)v.findViewById(R.id.dbtable_name);
        viewHolder.value = (EditText) v.findViewById(R.id.value_add_item);
        viewHolder.value.addTextChangedListener(new TextWatcher()
        {

            @Override
            public void afterTextChanged(Editable arg0) {
                // TODO Auto-generated method stub
                holder_values[viewHolder.ref]= arg0.toString();

            }

            @Override
            public void beforeTextChanged(CharSequence s, int start,
                    int count, int after) {
                // TODO Auto-generated method stub

            }

            @Override
            public void onTextChanged(CharSequence s, int start,
                    int before, int count) {
                // TODO Auto-generated method stub

            }

        });
        v.setTag(viewHolder);
    }
    else{
        viewHolder = (ViewHolder) v.getTag();
    }
    AddScreenItems addScreenItems = addScreenItemsList.get(position);
    if(addScreenItems!=null)
    {
        viewHolder.label.setText(addScreenItems.labelname);
        viewHolder.dbName.setText(addScreenItems.databaseTableName);
    //  viewHolder.ref = position;
        if (holder_values[position] != null) 
         { 
            viewHolder.value.setText(holder_values[position]); 
        } 

         else { 
             viewHolder.value.setText(""); 
         }


    }
    return v;


}

    }

             static class ViewHolder {
    public TextView label;
    public EditText value;
    public TextView dbName;
    int ref;
        }
私有类AddScreenArrayAdapter扩展了ArrayAdapter{
ViewHolder ViewHolder=null;
公共字符串[]的值;
public AddScreenArrayAdapter(上下文上下文,int textViewResourceId,
列出对象){
超级(上下文、textViewResourceId、对象);
holder_values=新字符串[objects.size()];
//TODO自动生成的构造函数存根
}
@凌驾
公共视图getView(int位置、视图转换视图、视图组父视图){
//TODO自动生成的方法存根
视图v=转换视图;
如果(v==null){
LayoutInflater vi=(LayoutInflater)getActivity().getSystemService(Context.LAYOUT\u INFLATER\u SERVICE);
v=vi.充气(R.布局.附加项行,空);
viewHolder=新的viewHolder();
viewHolder.label=(TextView)v.findViewById(R.id.label\u add\u item);
viewHolder.dbName=(TextView)v.findviewbyd(R.id.dbtable_name);
viewHolder.value=(EditText)v.findViewById(R.id.value\u添加项);
viewHolder.value.addTextChangedListener(新的TextWatcher()
{
@凌驾
public void PostTextChanged(可编辑arg0){
//TODO自动生成的方法存根
holder_值[viewHolder.ref]=arg0.toString();
}
@凌驾
更改前的公共无效(字符序列、整数开始、,
整数计数,整数后){
//TODO自动生成的方法存根
}
@凌驾
public void onTextChanged(字符序列,int start,
前整数,整数计数){
//TODO自动生成的方法存根
}
});
v、 setTag(视图持有者);
}
否则{
viewHolder=(viewHolder)v.getTag();
}
AddScreenItems AddScreenItems=addScreenItemsList.get(位置);
if(addScreenItems!=null)
{
viewHolder.label.setText(addScreenItems.labelname);
viewHolder.dbName.setText(addScreenItems.databaseTableName);
//viewHolder.ref=位置;
如果(保持器值[位置]!=null)
{ 
viewHolder.value.setText(holder_值[位置]);
} 
否则{
viewHolder.value.setText(“”);
}
}
返回v;
}
}
静态类视窗夹{
公共文本视图标签;
公共文本价值;
公共文本视图数据库名;
int-ref;
}

如果您在滚动后遇到问题,则是视图回收将您弄得一团糟。您基本上需要设置一个数组来保存EditText的内容,这样当您滚动时,它们就不会被弄乱

这里有一个链接,指向我就类似主题给出的另一个答案。它应该为你指明方向

编辑

当用户完成编辑文本框中的输入时,我使用
setOnFocusChangeListener
运行代码

qty.setOnFocusChangeListener(new View.OnFocusChangeListener() {
@Override
public void onFocusChange(View v, boolean hasFocus) {
    if (!hasFocus) {
        LinearLayout parent = (LinearLayout) v.getParent();
        EditText qtyTemp = (EditText) parent.findViewById(R.id.qty);
        quantity[pos] = qtyTemp.getText().toString();
    }
}
});

这可能与您处理视图回收的方式有关。你能从适配器发布你的
getView()
方法吗?我更新了我的代码,因为我使用了ArrayAdapter而不是Cursor适配器,但仍然面临这个问题。你能检查一下我的代码,帮我解决这个问题吗?我觉得还可以。我从来没有在TextWatchers方面取得过太多成功,我通常使用
setonfocuschangelister
,因此当用户过滤edittext框时,它就开始工作了。我将在我的答案中添加一个小例子。