Поиск в дочернем элементе в ExpandableListView - PullRequest
0 голосов
/ 24 декабря 2018

Я хочу сделать функцию поиска дочерних элементов в расширенном представлении списка.У меня есть hashMap типа (String, List String) для дочерних элементов, где List String содержит все дочерние элементы.Однако я не мог понять, как отфильтровать данные из списка для использования в моем поисковом запросе.

Я пробовал некоторые методы из сообщений stackoverflow: Поиск HashMap в ArrayList из HashMap , Как использовать редактировать текст в качестве поля поиска в расширяемом списке просмотра 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.Ява

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

        }

    }

Ответы [ 2 ]

0 голосов
/ 27 декабря 2018

Попробуйте:

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

Надеюсь, это поможет!

0 голосов
/ 24 декабря 2018

если вы ищете эффективный поиск с возможностью запроса, вам следует рассмотреть возможность использования других типов реляционных БД, таких как SQLite и др.

Если вы используете RxAndroid, вы можете использовать flatmap* оператор 1005 *, а затем поиск в полученном потоке

...