我有AutoCompleteTextView
的实例支持ArrayAdapter<String>
的实例。我注意到当我使用remove(T)
方法从此适配器中删除项目时,我使用for()
循环使用getItem(int)
从此适配器写入所有项目,它甚至写入删除的项目但是当我点击了AutoCompleteTextView
的实例,显示了ListView
项目,我使用for()
循环来编写现在正确输出的所有项目而不删除项目。我不知道为什么它会在调用remove(T)
之后删除项目,但在显示ListView
之后即使我在notifyDataSetChanged()
调用后调用remove(T)
也是如此。谢谢你的回复。
看看这个例子:
当您向AutoCompleteTextView
输入 a 时,您会看到4个项目,当您按写入项目按钮时,您会看到记录的所有4个项目。当您按删除第3项按钮时,它将从适配器中删除此项目,然后它将调用notifyDataSetChanged()
,之后它将写入所有项目,在那里您将看到将删除项目太。但是当您再次向AutoCompleteTextView
键入 a 时,现在您将看到3个项目,当您按写入项目时,它现在只会写入3个项目,但删除了一个项目
activity_main.xml中
<LinearLayout
android:orientation="vertical">
<LinearLayout
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<AutoCompleteTextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/auto_et"
android:layout_weight="1"
android:completionThreshold="1" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Write items"
android:id="@+id/button"
android:onClick="logItems" />
</LinearLayout>
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Delete 3rd item"
android:onClick="deleteItem" />
</LinearLayout>
MainActivity.java
public class MainActivity extends Activity {
AutoCompleteTextView auto_et = null;
ArrayAdapter<String> adapter = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ArrayList<String> list = new ArrayList<String>();
list.add("a");
list.add("ab");
list.add("abc");
list.add("abcd");
adapter = new ArrayAdapter<String>(this, android.R.layout.simple_dropdown_item_1line, list);
auto_et = (AutoCompleteTextView)findViewById(R.id.auto_et);
auto_et.setAdapter(adapter);
}
public void logItems(View v) {
for(int i = 0; i < adapter.getCount(); ++i) {
Log.d(null, adapter.getItem(i));
}
}
public void deleteItem(View v) {
adapter.remove(adapter.getItem(2));
adapter.notifyDataSetChanged();
logItems(null);
}
}
答案 0 :(得分:1)
当您开始在AutocompleteTextView
中点击某些内容时,您会进入过滤模式。 ArrayAdapter
保留原始数据集的副本,并使用此副本过滤掉数据集并将数据呈现给用户。保留副本,始终可以恢复原始数据集。您第一次要求过滤时会创建此副本。至于过滤机制,getItem
和getCount
将对过滤后的数据集起作用。 ArrayAdapter.remove(T)
,从副本中删除该项,如果该项不为空,则getItem
继续使用过滤后的值。当您从AutocompleteTextView
删除字符时,副本用于清理数据并更新ui。在您的情况下,它包含所有项目,但第三个项目。您可以查看ArrayAdapter
here