Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/185.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android Listview中的编辑文本滚动后的奇怪选择行为_Android_Listview_Android Listview_Android Edittext - Fatal编程技术网

Android Listview中的编辑文本滚动后的奇怪选择行为

Android Listview中的编辑文本滚动后的奇怪选择行为,android,listview,android-listview,android-edittext,Android,Listview,Android Listview,Android Edittext,listview中的EditText字段有问题。在我滚动一些设置后,似乎重置了selectAllOnFocus,并且选择光标变成了香蕉 我有一个带有自定义ArrayAdapter和自定义dataobject的listview。在这种情况下,对象只包含一个字符串以简化它 我的活动 // adapter + content List<ListviewObject> listViewContent = new ArrayList<ListviewObject>(

listview中的EditText字段有问题。在我滚动一些设置后,似乎重置了selectAllOnFocus,并且选择光标变成了香蕉

我有一个带有自定义ArrayAdapter和自定义dataobject的listview。在这种情况下,对象只包含一个字符串以简化它

我的活动

    // 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);
要解决我在设置的其他线程中发现的所有焦点问题,请执行以下操作: .setItemsCanFocustrue在listview上 android:DegenantFocusability=活动XML中的before子体 清单XML中的android:windowSoftInputMode=adjustPan

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

在我滚动并单击一些编辑文本之前,会发生这种情况。上次聚焦模糊,单击一次聚焦,内容被选中

在我再次向下和向上滚动,并像以前一样单击之后,就会发生这种情况


这是由于listView回收机制造成的。要了解有关listview回收机制的更多信息,可以参考以下内容

在本例中,通过存储上次聚焦的editText并在getView中将焦点设置为仅上次存储的整数并跳过其他位置,可以避免此问题。希望这能帮助你

这很简单:

声明字符串[],以跟踪addTextChangedListener的PostTextChanged中每个EditText的输入

注意秩序:

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]);
将android:WindowsOfInputMode=adjustPan添加到AndroidManifest文件中的活动中


祝你好运

查看此链接据我所知,在列表视图中使用编辑文本是一种不好的做法。因此,使用TextView而不是EditText并在单击/模糊时替换它们似乎是最可行的选择,甚至可以重用convertView,但不使用其中的EditText在getView上重新创建它。在最后的设置中,我遇到了更多的怪癖,所以我并不真的想通过一些糟糕的练习来解决问题。我决定解决这个问题,因为不止一件事情出了问题。
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]);