2015-12-29 54 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

代碼