2011-02-04 88 views
0

我有一個搜索字段,我想使用從兩個不同位置收集的數據自動填充數據:本地數據庫(sqlite)和遠程搜索API。我想立即顯示本地選項,然後暫停(以便在每次按鍵時不會發出API請求),請啓動API請求。將結果添加到可見的AutoCompleteTextArea下拉列表中

問題出現在API請求返回時。 如何將這些條目添加到AutoCompleteTextArea的(已經可見的)下拉列表中?現在,我有一個擴展BaseAdapter類:

private class MyAutoCompleteAdapter extends BaseAdapter implements Filterable { 
    private List<String> resultList; 
    private MySearchFilter filter; 

    public BeerAutoCompleteAdapter() { 
     super(); 
     results = new ArrayList<String>(); 
     filter = new MySearchFilter(); 
    } 

    // getView, getCount, getItem overridden 

    private void add(String newResult) { 
     results.add(newResult); 
     notifyDataSetChanged(); 
    } 

    private class MySearchFilter extends Filter { 
     // performFiltering and publishResults overridden 
    } 
} 

一切工作的90%。當我撥打add(newResult)時,新結果會被添加到下拉列表的底部。不幸的是,下拉菜單的高度沒有改變。如果在API請求之前有兩個結果,並且有一個從API返回,那麼發生的只是我在下拉列表中獲得了一個滾動條。只要我滾動,用戶界面決定「哦,是的,有一個太空間」,並顯示它。

我試過我的AutoCompleteTextArea上的forceLayout()requestLayout()以及notifyDataSetInvalidated()。沒有骰子。

+0

今天早上我有一個想法,也許現在的問題是,我正在使用Filter來獲取本地數據,但是接下來的API調用和add()調用都是從父類發生的。我可以重寫過濾器嗎?它可以完成所有工作? – Plutor 2011-02-04 12:53:54

回答

0

我想通了。我正在瀏覽AutoCompleteTextArea source code,我注意到showDropDown()具有計算高度和寬度的邏輯,即使下拉列表已經可見,也是如此。我試過了(除了notifyDataSetChanged()),它的工作。

1

菜單條目顯示在單獨的佈局中,該佈局與AutoCompleteTextView關聯,但不是其中的一部分。調用forceLayout()requestLayout()該佈局可能做你要找的。

您還可以通過在AutoCompleteTextView上調用getDropDownHeight來強制更改高度,向其中添加一定量,然後調用setDropDownHeight並顯示結果。

+0

手動設置下拉高度似乎有點klugey。我如何獲得該視圖?在AutoCompleteTextView上有一堆getDropDown *()函數,但似乎沒有做我想要的東西。 – Plutor 2011-02-04 14:01:18

相關問題