ArrayAdapter <t>如何处理项目?

时间:2015-12-29 21:23:47

标签: java android

我有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);
    }
}

1 个答案:

答案 0 :(得分:1)

当您开始在AutocompleteTextView中点击某些内容时,您会进入过滤模式。 ArrayAdapter保留原始数据集的副本,并使用此副本过滤掉数据集并将数据呈现给用户。保留副本,始终可以恢复原始数据集。您第一次要求过滤时会创建此副本。至于过滤机制,getItemgetCount将对过滤后的数据集起作用。 ArrayAdapter.remove(T),从副本中删除该项,如果该项不为空,则getItem继续使用过滤后的值。当您从AutocompleteTextView删除字符时,副本用于清理数据并更新ui。在您的情况下,它包含所有项目,但第三个项目。您可以查看ArrayAdapter here

的代码
相关问题