在ListView中滚动的EditText含量的变化含量、ListView、EditText

2023-09-04 05:17:25 作者:他城她人她的心。

我有一个Android应用程序与定制适配器,扩展了游标适配器。 我overrided bindView和的CursorAdapter的Ne​​wView的方法。每一个我的ListView行包含一个EditText。当我的EditText和下滚ListView中输入一些文字的EditText文本的内容被移动到其他的EditText。 谁能帮我在设法解决这个问题要怎么prevent的EditText从重用的内容时的ListView向下滚动。

在此先感谢,

这里是code:

 私有类AddScreenArrayAdapter扩展ArrayAdapter< AddScreenItems> {

  ViewHolder viewHolder = NULL;
  公众的String [] holder_values​​;

公共AddScreenArrayAdapter(上下文的背景下,INT textViewResourceId,
        名单< AddScreenItems>对象){
    超(背景下,textViewResourceId,对象);
    holder_values​​ =新的String [objects.size()];

    // TODO自动生成构造函数存根
}

@覆盖
公共查看getView(INT位置,查看convertView,ViewGroup中父){
    // TODO自动生成方法存根

    视图V = convertView;
    如果(V == NULL){
        LayoutInflater VI =(LayoutInflater)getActivity()getSystemService(Context.LAYOUT_INFLATER_SERVICE)。
        V = vi.inflate(R.layout.additem_row,NULL);
        viewHolder =新ViewHolder();
        viewHolder.label =(TextView中)v.findViewById(R.id.label_add_item);
        viewHolder.dbN​​ame =(TextView中)v.findViewById(R.id.dbtable_name);
        viewHolder.value =(EditText上)v.findViewById(R.id.value_add_item);
        viewHolder.value.addTextChangedListener(新TextWatcher()
        {

            @覆盖
            公共无效afterTextChanged(编辑为arg0){
                // TODO自动生成方法存根
                holder_values​​ [viewHolder.ref] = arg0.toString();

            }

            @覆盖
            公共无效beforeTextChanged(CharSequence中,诠释开始,
                    诠释计数,之后INT){
                // TODO自动生成方法存根

            }

            @覆盖
            公共无效onTextChanged(CharSequence中,诠释开始,
                    INT之前,诠释计数){
                // TODO自动生成方法存根

            }

        });
        v.setTag(viewHolder);
    }
    其他{
        viewHolder =(ViewHolder)v.getTag();
    }
    AddScreenItems addScreenItems = addScreenItemsList.get(位置);
    如果(addScreenItems!= NULL)
    {
        viewHolder.label.setText(addScreenItems.labelname);
        viewHolder.dbN​​ame.setText(addScreenItems.databaseTableName);
    // viewHolder.ref =位置;
        如果(holder_values​​ [位置]!= NULL)
         {
            viewHolder.value.setText(holder_values​​ [位置]);
        }

         其他 {
             viewHolder.value.setText();
         }


    }
    返回伏;


}

    }

             静态类ViewHolder {
    公众的TextView标签;
    公众的EditText值;
    公众的TextView DBNAME;
    诠释裁判;
        }
 

解决方案

如果您滚动它的观点回收多数民众赞成搞乱您以后有问题。你基本上需要建立一个数组来保存EditTexts的内容,所以当你滚动他们没有得到搞砸了。

listView获取item的Edit内容,listView中的edit内容在滚动时自动赋值了前面的内容 移动开发 weixin 33751566的博客 CSDN博客

下面有一个链接到另外一个答案,我介绍了一个类似的话题。它应该指向你的方式。 SO回答

修改

我用 setOnFocusChangeListener 当用户完成了的EditText中的条目运行code。

  qty.setOnFocusChangeListener(新View.OnFocusChangeListener(){
@覆盖
公共无效onFocusChange(视图V,布尔hasFocus){
    如果(!hasFocus){
        的LinearLayout父=(的LinearLayout)v.getParent();
        EditText上qtyTemp =(EditText上)parent.findViewById(R.id.qty);
        。数量[POS] = qtyTemp.getText()的toString();
    }
}
});
 

I have an Android application with an customized adapter that extends Cursor Adapter. I overrided bindView and newview methods of CursorAdapter. Each of my ListView row contains an EditText. When I enter some text in EditText and scrolldown the ListView the content of the EditText text is moved to another EditText. Can anyone help me in sorting out this issue to how to prevent EditText from reused its content when ListView is scrolled down.

Thanks in Advance,

Here is the code:

        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;
        }

解决方案

If you're having problem after scrolling it's the view recycling that's messing you up. You basically need to set up an array to hold the contents of the EditTexts so when you scroll they don't get messed up.

Here's a link to another answer I gave on a similar topic. It ought to point the way for you. SO Answer

EDIT

I use setOnFocusChangeListener to run code when the user finishes an entry in the EditText box.

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();
    }
}
});

 
精彩推荐
图片推荐