簡體   English   中英

滾動后Listview中的EditText奇怪的選擇行為

[英]EditText in Listview Strange selection behavior after scroll

我在列表視圖中的EditText字段有問題。 我滾動后,似乎重置了某些設置(selectAllOnFocus),並且選擇光標變成了香蕉。

我有一個帶有自定義ArrayAdapter和自定義dataobject的listview。 在這種情況下,對象僅包含一個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"

聚焦和編輯文本效果很好。 當我滾動時,將保留正確的值,所有這些似乎都可以正常工作。

在滾動並單擊某些EditText之前,會發生這種情況。 (最后聚焦模糊,單擊一個聚焦,選擇內容)

http://imgur.com/eeIKhCv

當我再次上下滾動並執行與以前相同的單擊后,就會發生這種情況。

http://imgur.com/75mjPc3

這是由於listView回收機制。 要了解有關Listview回收機制的更多信息,請參考此鏈接

在您的情況下,可以通過存儲最后一個焦點的editText來避免該問題,並在getView中將焦點設置為僅最后存儲的整數,並跳過其他位置。 希望這對您有幫助...

這很容易:

  1. 聲明一個String[]以跟蹤"addTextChangedListener()afterTextChanged()內部的每個EditText的輸入。

  2. 注意順序:

     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]); 
  3. android:windowSoftInputMode="adjustPan"到AndroidManifest文件中的Activity中。

祝好運!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM