Я использую 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