RecycylerView с SortedList показывает дубликаты элементов - PullRequest
0 голосов
/ 02 июля 2018

Я использую SortedList с RecyclerViewAdapter для своего списка. Поэтому я отправляю свои элементы (загруженные из моего бэкэнда в фоновом потоке) через слушателя на мой GameListAdapter. Согласно реализованной логике в моих SortedListAdapterCallback элементы, отправленные на адаптер с одинаковым идентификатором, должны быть заменены, а не вставлены несколько раз. К сожалению, это в основном, но не всегда так.

Это конструктор моего GameListAdapter

public GameListAdapter(RecyclerView list) {

    this.list = list;

    gamelistItems = new SortedList<>(GameListItem.class, new SortedListAdapterCallback<GameListItem>(this) {

        @Override
        public int compare(GameListItem o1, GameListItem o2) {

            return o1.getDate().compareTo(o2.getDate());

        }

        @Override
        public boolean areContentsTheSame(GameListItem oldItem, GameListItem newItem) {

            if (oldItem instanceof GameListHeader && newItem instanceof GameListHeader) {

                return oldItem.getDate().equals(newItem.getDate());

            } else if (oldItem instanceof Game && newItem instanceof Game) {

                Game gameOld = (Game) oldItem;
                Game gameNew = (Game) newItem;

                if (gameOld.getId() != gameNew.getId()) {
                    return false;
                }
                if (!gameOld.getTeamHome().equals(gameNew.getTeamHome())) {
                    return false;
                }
                if (!gameOld.getTeamAway().equals(gameNew.getTeamAway())) {
                    return false;
                }
                if (gameOld.getScoreHome() != gameNew.getScoreHome()) {
                    return false;
                }
                if (gameOld.getScoreAway() != gameNew.getScoreAway()) {
                    return false;
                }
                if (!gameOld.getState().equals(gameNew.getState())) {
                    return false;
                }
                return true;
            }

            return false;

        }

        @Override
        public boolean areItemsTheSame(GameListItem item1, GameListItem item2) {

            if (item1 instanceof GameListHeader && item2 instanceof GameListHeader) {

                return item1.getDate() == item2.getDate();

            } else if (item1 instanceof Game && item2 instanceof Game) {

                return ((Game) item1).getId() == ((Game) item2).getId();

            }

            return false;
        }

    });

    DataStorage.getInstance().registerListener(this);
}

Элементы добавляются в список следующим способом:

@Override
public void onAddedGame(Game game) {

    Handler handler = new Handler();
    handler.post(() -> gamelistItems.add(game));

}

Несмотря на то, что предметы имеют одинаковый идентификатор, я вижу это в своем списке:

https://i.stack.imgur.com/vWYml.png

1 Ответ

0 голосов
/ 02 июля 2018

Вы сравниваете ответ от GameListHeader.getDate() двумя разными способами. В areContentsTheSame() это

return oldItem.getDate().equals(newItem.getDate());

и в areItemsTheSame() вы используете

return item1.getDate() == item2.getDate();

Хотя из вашей публикации неясно, как генерируется ответ от getDate() или каков тип данных, я думаю, что один из них неправильный. Если getDate() возвращает String, тогда String.equals(String) - это то, что вам нужно, а == неверно.

...