Listview中的EditText滚动后的奇怪选择行为

时间:2014-06-11 12:53:33

标签: android listview android-listview android-edittext

我在listview中遇到EditText字段的问题。滚动后,某些设置似乎被重置(selectAllOnFocus),选择光标变为香蕉。

我有一个带有自定义ArrayAdapter和自定义数据对象的列表视图。在这种情况下,对象只保存一个String(以简化它)。

我的活动

    // adapter + content
    List<ListviewObject> listViewContent = new ArrayList<ListviewObject>();
    for(int i = 0; i < 50; i++) {
        listViewContent.add(new ListviewObject("num: " + i));
    }       
    adapter = new CustomListAdapter(AddNewPerson.this, R.layout.list_item, listViewContent);

    // list
    ListView mListView = (ListView)findViewById(R.id.sample_list);
    mListView.setItemsCanFocus(true);
    mListView.setAdapter(adapter);

我的适配器

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    HolderObject holder = null;

    if(convertView == null) {
        convertView = mLayoutInflater.inflate(layoutResourceId, parent, false);
        holder = new HolderObject();
        holder.name = (TextView) convertView.findViewById(R.id.txt);
        convertView.setTag(holder);
    } else {
        holder = (HolderObject) convertView.getTag();
    }

    holder.lvObject = items.get(position);

    setNameTextChangeListener(holder);
// Retrieve the correct value 
    holder.name.setText(holder.lvObject.getName());

    return convertView;
}

public static class HolderObject {
    ListviewObject lvObject;
    TextView name;
}

private void setNameTextChangeListener(final HolderObject holder) {
    holder.name.addTextChangedListener(new TextWatcher() {

        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {
// Update the value
            holder.lvObject.setName(s.toString());
        }

        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after) { }

        @Override
        public void afterTextChanged(Editable s) { }
    });
}

要解决我在其他线程中找到的所有焦点问题:我 列表视图上的.setItemsCanFocus(true)
活动XML中的android:descendantFocusability="beforeDescendants" 清单XML中的android:windowSoftInputMode="adjustPan"

聚焦和编辑文本工作正常。当我滚动时,保持正确的值,所有这些似乎都能正常工作。

在我滚动之前,我点击了一些EditTexts,这就发生了。 (最后聚焦模糊,点击一个焦点,选择内容)

http://imgur.com/eeIKhCv

在我向下再向上滚动并按照之前的相同点击后,会发生这种情况。

http://imgur.com/75mjPc3

2 个答案:

答案 0 :(得分:0)

这是由于listView的回收机制。要了解有关listview回收机制的更多信息,请参阅此link

在你的情况下你通过存储最后一个聚焦的editText来避免这个问题,并且在getView中将焦点设置为仅存储最后存储的整数并跳过其他位置。希望这能帮到你...

答案 1 :(得分:0)

这很简单:

  1. 声明一个String[],以跟踪EditText的{​​{1}}中每个afterTextChanged()的输入。

  2. 请注意顺序:

    "addTextChangedListener()
  3. viewHolder.editText.removeTextChangedListener(viewHolder.textWatcher); viewHolder.textWatcher = new TextWatcher() { @Override public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) { } @Override public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) { } @Override public void afterTextChanged(Editable editable) { mInputs[position] = editable.toString(); //record input viewHolder.editText.setSelection(viewHolder.editText.getText().length()); //set cursor to the end } }; viewHolder.editText.addTextChangedListener(viewHolder.textWatcher); viewHolder.editText.setText(mInputs[position]); 添加到AndroidManifest文件中的android:windowSoftInputMode="adjustPan"中。

祝你好运!