在 ExpandableListView 的子项中搜索

Search within child item in ExpandableListView

我想在可扩展列表视图中执行子项的搜索功能。我有一个用于子项的 (String, List String) 类型的 hashMap,其中 List String 包含所有子项。但是,我不知道如何从列表中过滤数据以用于我的搜索查询。

我尝试了 Whosebug 帖子中的一些方法:Search a HashMap in an ArrayList of HashMapHow to use edit text as search box in expandable listview android? 和其他一些,但没有帮助。

MainActivity.java

List<String> listP = new ArrayList<>();
HashMap<String, List<String>> listC = new HashMap<>();
ExpandableListAdapter expandableListAdapter = new ExpandableListAdapter(this, listP, listC, this);

listP.add("Movie");
listP.add("Building");
listP.add("Car");

List <String> movie = new ArrayList<>();
movie.add("horror");
movie.add("action");

List <String> building = new ArrayList<>();
building.add("bank");
building.add("hotel");

List <String> car = new ArrayList<>();
car.add("BMW");
car.add("Mercedes");

listC.put(listP.get(0),movie);
listC.put(listP.get(1),building);
listC.put(listP.get(2),car);

ExpandableListAdapter.java

List<String> listDataHeader;
private HashMap<String, List<String>> listHashMap;


public ExpandableListAdapter(Context context, List<String> listDataHeader, HashMap<String, List<String>> listHashMap, Activity activity) { this.context = context;
    this.listDataHeader = listDataHeader;
    this.listHashMap = listHashMap;
    this.activity = activity;
}


public void filterData(String query)
    {
        query = query.toLowerCase();
        listDataHeader.clear();

        if(query.isEmpty())
        {
            listDataHeader.clear();
        }
        else // if user writes something
        {
            // I don't know how to get the values from the child items to compare it with query

        }

    }

如果您正在寻找可查询方式的高效搜索,您应该考虑使用其他关系数据库类型,例如 SQLite 和其他类型。

如果您使用的是 RxAndroid,您可以使用 flatmap 运算符,然后在结果流中搜索

试试这个:

List<String> listDataHeader;
List<String> backupHeader;
private HashMap<String, List<String>> listHashMap;  // Backup lists.
private HashMap<String, List<String>> backupHashMap;

public void filterData(String query)
{
    if(backupHeader == null){     // Save original lists for the first time.
        backupHeader = new ArrayList<>();
        backupHeader.addAll(listDataHeader);
        backupHashMap = new HashMap<>();
        backupHashMap.putAll(listHashMap);
    }
    query = query.toLowerCase();
    listDataHeader.clear();
    listHashMap.clear();
    if(query.isEmpty())
    {
        listDataHeader.addAll(backupHeader);
        listHashMap.putAll(backupHashMap);
    }
    else // if user writes something
    {
        for(String header: backupHeader) {
            List<String> tmpList = new ArrayList<>();
            for(String item:backupHashMap.get(header)){
                if(item.toLowerCase().contains(query)) tmpList.add(item);
            }
            if(tmpList.size() > 0){
                listDataHeader.add(header);
                listHashMap.put(header, tmpList);
            }
        }
    }
    notifyDataSetChanged();
}

希望对您有所帮助!