2012-11-19 56 views
0

我有一個Android ListView連接到Simpleadapter。它根據某些元素的文本內容以及這些元素的一些文本標題和子標題在列表視圖上輸出特定的靜態圖像作爲圖標。基於SimpleAdapter的Android Listview包含圖像說明當使用Textwatcher搜索

我也爲edittextview設置了一個textwatcher來過濾和自動搜索。

在列表視圖中進行搜索能正常運行。不過,我注意到textwatcher在列表視圖中包含了文本內容元素(現在轉換爲圖像)。所以它看起來是在列表視圖中輸出一些不正確的行,因爲用戶只能看到標題/子標題,而不能看到圖像圖標背後的文本內容。

是否有更好的方式來過濾listview,這會排除圖像圖標後面的原始文本?

+0

爲'SimpleAdapter'過濾器檢查所有從各行的'Map'列在默認情況下,所以你需要提供你的自己的過濾器,只用於過濾你想要的列。 – Luksprog

+0

謝謝@Luksprog。我最終做到了這一點。基本上在textwatcher的afterTextChanged方法上連接了一個手動過濾器。所述過濾器遍歷整個列表視圖元素並選擇那些匹配的列表視圖元素。 notifydatasetchanged然後重置列表視圖。剛剛讓我再想一想,如果這是最好的方法,或者我應該使用不同的適配器。 –

+0

這(可能如果你測試)的作品,但它不是最好的方式。最好的方法是創建自己的'SimpleAdapter'並覆蓋'getFilter()'方法來返回一個自定義的'Filter',它可以像你想要的那樣過濾列表。這樣做的主要原因是存在後臺線程來進行過濾。 – Luksprog

回答

1

這是我最終會做的代碼(感謝@Luksprog):

public void afterTextChanged(Editable s) { 
    if(s.length()>0){ 
     int count = viewListAdapter.getCount(); 
     if(count > 0){ 
      hashMapListForListViewcopy.clear(); 
      for (int i = 0; i < count; i++) { 
       Map temp = (Map) viewListAdapter.getItem(i); 
       String txtOfferName = temp.get("txtOfferName").toString(); 
       HashMap<String, String> entitiesHashMap; 
       entitiesHashMap = new HashMap<String, String>(); 
       if (txtOfferName.toLowerCase().contains(s.toString().toLowerCase())) { 
        System.out.println("Found a match!"); 
        Log.v("txtOfferName", txtOfferName); 
        Log.v("viewListAdapter.getItem(i)","" + viewListAdapter.getItem(i)); 
        entitiesHashMap = (HashMap<String, String>) viewListAdapter.getItem(i); 
        hashMapListForListViewcopy.add(entitiesHashMap); 
       } 
      } 
     } 
     viewListAdaptercopy.notifyDataSetChanged(); 
    } 
相關問題