2015-12-29 42 views
1

我有一个由ArrayAdapter<String>实例支持的AutoCompleteTextView实例。我注意到,当我使用remove(T)方法从此适配器中删除一个项目,然后使用for()循环从此适配器使用getItem(int)写入所有项目时,它甚至会删除项目,但是当我点击AutoCompleteTextViewListView的项目时显示出来,我用for()循环来写所有项目,现在它输出正确,没有删除项目。我不知道为什么它没有要求remove(T)后删除的项目,但显示ListView后,即使我以后remove(T)电话呼叫notifyDataSetChanged()。谢谢你的回复。ArrayAdapter <T>如何处理项目?

请看下面的例子: 当你输入一个AutoCompleteTextView你会看到4个项目,当你按下写项目按钮,您将看到所有4项记录。当您按下删除第三个项目按钮,它就会从该适配器删除此项目,然后它会调用notifyDataSetChanged()之后,它会写所有项目,并在那里你会看到,也将被删除的项目。但是,当你再次输入一个AutoCompleteTextView,现在你会看到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

当你开始tipying的东西你AutocompleteTextView您在过滤模式进入。 ArrayAdapter保留原始数据集的副本,并使用此副本过滤出数据集并将数据呈现给用户。保留副本,它总是可以恢复原始数据集。这是您第一次要求过滤时创建的副本。至于过滤机制,getItemgetCount将在过滤的数据集上工作。 ArrayAdapter.remove(T),从副本中删除项目(如果它不为空),而getItem继续使用过滤的值。当您从AutocompleteTextView中删除字符时,该副本将用于清理数据并更新UI。在你的情况下,它包含所有项目,但第三个。你可以看看到的ArrayAdapterhere

代码