2012-11-19 11 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(); 
    } 
相关问题