Мои listview получают данные из webservice, а возвращаемые данные иногда содержат некоторые id (но разные данные).

Для тех данных, которые имеют одинаковый идентификатор, я хочу отображать их только listview один раз.

Что я пробовал в getView:

    if(position > 0)
        prevId = getItem(position-1).getId();

    if(getItem(position).getId() == prevId)
        //skip current row

Проблема в том, как пропустить текущую строку? (потому что id такой же, как предыдущий)

1
Blaze Tama 9 Ноя 2014 в 16:42

2 ответа

Одним из решений может быть добавление предыдущих строк в ArrayList , поэтому при создании новой строки в getView() вы можете проверить, что если содержимое текущей строки имеет идентификатор, который находится внутри вашего arrayList, тогда ничего не делайте!

1
Arash GM 9 Ноя 2014 в 16:57
Спасибо. Что вы подразумеваете под "ничего не делать"? Как это сделать?
 – 
Blaze Tama
9 Ноя 2014 в 16:58
Надеюсь, это поможет;), если идентификатор текущей строки не совпадает в ArrayList, поэтому добавьте данные в ArrayList и настройте свое представление с данными списка, в противном случае не добавляйте его в ArrayList и устанавливайте данные строки, которые значит ничего не делать.
 – 
Arash GM
9 Ноя 2014 в 17:00
: одна проблема - это пустые строки, если идентификатор существует в ArrayList, поэтому я думаю, что вам нужно манипулировать данными, например, если данные, введенные ранее в строке 1, в строке 2 вы должны установить данные строки 3 и предотвратить IndexArrayOutOfBoundException, уменьшите свой , содержимое адаптера на 1. как упомянул пользователь 2139233, лучший и самый простой способ - предотвратить повторяющиеся данные в начале! Удачи
 – 
Arash GM
9 Ноя 2014 в 17:07
Я думаю, что это не лучшее решение для этой цели. просто попробуйте установить конкретное условие и увеличить номер позиции в getView.
 – 
Setmax
4 Ноя 2015 в 13:44

Лучше всего отфильтровать данные перед вводом их в ListView. Добавьте структуру данных и классы, которые вы используете, чтобы получить подробную справку.

Я думаю, вам нужно сделать что-то подобное (T означает тип с функцией getId()):

   List<T> removeDuplicateFromList(List<T> data){
       HashMap<String,T> filterdData = new HashMap<String,T>();
       for (T t: data){
            if (!filterdData.containKey(t.getId()){
                  filterdData.put(t.getId(),t);
            }else{
                  //Update the data at the map if needed
            } 
       }
       return filterdData.values();
   }
1
user2139223 18 Ноя 2014 в 15:12
Спасибо. Я думаю, что фильтрация данных невозможна, потому что мне нужны другие данные, кроме id
 – 
Blaze Tama
9 Ноя 2014 в 16:57