调用适配器的notifyDataSetChanged方法时如何避免jerk?

时间:2015-09-17 20:38:01

标签: android performance listview android-listview

我正在尝试在listView中添加分页。

我在自定义BaseAdapter中添加了一个方法,在滚动到列表中的第一个项目时,会在列表顶部添加下一页结果。

public void addEntriesToTop(List<ChatModel> entries) {
// Add entries to the top of the list
this.chatMessages.addAll(0, entries);
notifyDataSetChanged();

}

因此,如果我必须在ListView上添加下一页,我在我的活动中使用这样的。

//result contain new items to be added to top of list
adapter.addEntriesToTop(result);
//so that list scroll sets to last visible message to user
final int index =  result.size();
listView.post(new Runnable() {
                            @Override
                            public void run() {
                             //go to user's last scroll position
                              messagesContainer.setSelectionFromTop(index, 0);
                                }
                            });

此方法工作正常并保留用户的最后滚动位置。但它有一个问题,当我调用addEntriesToTop()时它将ListView滚动到底部(因为notifyDataSetChanged())然后当我调用setSelectionFromTop时它会滚动到用户的最后位置。在这种转变中,有一个小混蛋。

请帮助我顺利过渡。

由于

1 个答案:

答案 0 :(得分:1)

  

由于ListView很老,现在已经过时了,现在您可以使用Recyclerview   而不是ListView,这里的链接可以帮助您转换您的   从ListView到RecyclerView。 RecyclerView有很多添加自定义动画的方法,并且在添加/删除项目时没有任何麻烦。

Replacing ListView with RecyclerView

  

对于默认动画,您可以使用此链接:

RecyclerView Animations – Add & Remove Items