【发布时间】:2017-04-12 19:03:05
【问题描述】:
我在 RecyclerView Adapter 中使用 SortedList,我想知道在我更改 Adapter 中的数据后 RecyclerView 何时完成更新(并调用了适当的方法,例如 notifyItemRangeChanged)。有没有办法做到这一点?
我的问题是我需要在过滤其内容后将 RecyclerView 滚动到顶部。我从适配器上的 Activity 方法调用,该方法过滤其成员上的项目。之后我只是在 RecyclerView 上调用 scrollToPosition(0) ,它并不总是按预期工作,尤其是当列表上的更改后操作只有 1 项时。
这是我在适配器上调用的更新方法的代码:
private SortedList<Game> games;
private ArrayList<Game> allGames;
public void search(String query) {
replaceAll(filterGames(query));
}
public void replaceAll(Collection<Game> games) {
this.games.beginBatchedUpdates();
List<Game> gamesToRemove = new ArrayList<>();
for (int i = 0; i < this.games.size(); i++) {
Game game = this.games.get(i);
if (!games.contains(game)) {
gamesToRemove.add(game);
}
}
for (Game game : gamesToRemove) {
this.games.remove(game);
}
this.games.addAll(games);
this.games.endBatchedUpdates();
}
private Collection<Game> filterGames(String query) {
query = query.toLowerCase();
List<Game> filteredGames = new ArrayList<>();
for (Game game : allGames) {
String gameTitle = game.getTitle().toLowerCase();
if (gameTitle.contains(query)) {
filteredGames.add(game);
}
}
return filteredGames;
}
这里我如何从 Activity 中调用它:
private RecyclerView gamesList;
private GameAdapter gamesAdapter;
@Override
public boolean onQueryTextChange(String newText) {
gamesAdapter.search(newText);
gamesList.scrollToPosition(0);
return false;
}
【问题讨论】:
-
但是你需要它做什么?用例是什么?
-
我想在添加/删除项目后将 RecyclerView 滚动到顶部。当我在适配器上开始更新后尝试滚动时,会出现问题,因为项目仍在处理中。
-
because items are still being processed如果它们不在屏幕上,如何“被处理”,从而与窗口分离? -
他们正在从旧职位转移到新职位。我说的是动画。当我在更新调用和滚动到第一个位置之间添加延迟时,没有问题。
-
我认为你遗漏了一些东西。很可能您永远不需要知道“更新”何时完成。如果您等到“更新”完成(这意味着例如调用了 7 次
onBindViewHolder,因为当前有很多项目处于活动状态),那么它将如何影响屏幕外的项目?只要为该项目调用onBindViewHolder(),您仍将执行该“处理”。
标签: android android-recyclerview