【问题标题】:Search within child item in ExpandableListView在 ExpandableListView 的子项中搜索
【发布时间】:2019-05-23 17:51:42
【问题描述】:

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

我尝试了一些来自 stackoverflow 帖子的方法: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

        }

    }

【问题讨论】:

    标签: android filter hashmap expandablelistview


    【解决方案1】:

    试试这个:

    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();
    }
    

    希望有帮助!

    【讨论】:

    • 很好,工作就像一个魅力。但是,您在 if 语句之一之后错过了大括号
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-11-07
      • 1970-01-01
      • 2012-03-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多