Может быть, вы можете попытаться объявить адаптер над всеми вызовами методов (как в методе onCreate()
вашего GroupSelectionActivity
)
allGroupsAdapter = new GroupSelectionTrendingAdapter(
getApplicationContext(),
new ArrayList<SelectionGroupItem>(),
GroupSelectionActivity.this,
ALL_GROUPS_MODE
);
// Considering allGroups is your RecyclerView
allGroups.setAdapter(allGroupsAdapter);
Затем в GroupSelectionTrendingAdapter
выставить метод updateData(List<SelectionGroupItem> items)
@UiThread
public void updateData(List<SelectionGroupItem> newItems) {
/**
* this.selectionGroupItems is a property of GroupSelectionTrendingAdapter
* that is used to display the data.
*
* It is init in the constructor, then it never changes
* and is never reset using the = operator
*/
this.selectionGroupItems.clear()
this.selectionGroupItems.addAll(newItems)
// On the UI thread, as it is updating UI items.
this.notifyDataSetChanged()
}
А затем в вашем обратном вызове:
if (response.body() != null) {
// ...
for (TrendingGroupsResponse response1 : response.body())
allGroupsList.add(new SelectionGroupItem(response1));
// not needed anymore if (offset == 0) {
// Call is wrapped to run on the UI thread
runOnUiThread(new Runnable() {
@Override
public void run() {
allGroupsAdapter.updateData(allGroupsList);
}
});
// ...
}
Таким образом, адаптер никогда не меняется, он устанавливается в самом начале жизни вашего экрана.Единственное, что изменяется, - это данные, которые вы отображаете в.
runOnUiThread
существует, чтобы гарантировать, что вызов сделан в отображающей ветке
NB. Также, яЯ не уверен, почему вы даете getApplicationContext()
своему адаптеру, так как GroupSelectionActivity.this
также является контекстом.Пожалуйста, напомните, что не храните ссылки на действия в представлениях, которые могут быть уничтожены, сохраняя ссылку (утечки памяти)