Android 编辑ListView滚动上的文本内容更改
我有一个Android应用程序,它带有一个自定义适配器,扩展了游标适配器。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
我重写了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框时,它就开始工作了。我将在我的答案中添加一个小例子。