列表视图滚动加载 (Android)
Listview load on scroll (Android)
我正在开发一个聊天应用程序,我试图一次加载 10 条消息,当用户向上滚动时,它又加载了 10 条消息。因此我使用 stackFromBottom=true 从底部加载消息:
<ListView
android:id="@+id/messagesList"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:transcriptMode="normal"
android:stackFromBottom="true">
而且我有一个滚动侦听器来了解用户何时到达顶部(firstVisibleItem == 0,即第一条消息),因此我可以加载更多消息:
messagesList.setOnScrollListener(new AbsListView.OnScrollListener() {
@Override
public void onScrollStateChanged(AbsListView absListView, int i) {
}
@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
if (firstVisibleItem ==0 && !loading && !startApp) {
loading = true;
skip += 10;
fetchMessages = new FetchMessages(); //load more items
fetchMessages.execute(true);
}
}
});
问题是当您向上滚动并到达顶部时,会再加载 10 条消息,但列表视图会自动滚动到底部。当新项目添加到 Listview 时,我想保持在完全相同的位置,就像任何常规聊天应用程序一样。
这是添加消息的方法:
@Override
protected void onPostExecute(String json) {
if(json!=null){
...
//After Parse JSON ...
chatMessageAdapter.list.add(0,chatMessage); //add the message to the top of the list
chatMessageAdapter.notifyDataSetChanged(); //listview scrolls to the bottom afterwards
}
loading = false;
startApp = false;
}
我尝试了其他线程中的许多建议,但其中 none 确实有效。我希望有人能在这里提供帮助。
非常感谢。
对我有用的是:
// save index and top position
int index = mList.getFirstVisiblePosition();
View v = mList.getChildAt(0);
int top = (v == null) ? 0 : v.getTop();
// notify dataset changed or re-assign adapter here
// restore the position of listview
mList.setSelectionFromTop(index, top);
请注意,您必须从 xml 中删除 android:transcriptMode="normal",否则它将无法工作。
我正在开发一个聊天应用程序,我试图一次加载 10 条消息,当用户向上滚动时,它又加载了 10 条消息。因此我使用 stackFromBottom=true 从底部加载消息:
<ListView
android:id="@+id/messagesList"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:transcriptMode="normal"
android:stackFromBottom="true">
而且我有一个滚动侦听器来了解用户何时到达顶部(firstVisibleItem == 0,即第一条消息),因此我可以加载更多消息:
messagesList.setOnScrollListener(new AbsListView.OnScrollListener() {
@Override
public void onScrollStateChanged(AbsListView absListView, int i) {
}
@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
if (firstVisibleItem ==0 && !loading && !startApp) {
loading = true;
skip += 10;
fetchMessages = new FetchMessages(); //load more items
fetchMessages.execute(true);
}
}
});
问题是当您向上滚动并到达顶部时,会再加载 10 条消息,但列表视图会自动滚动到底部。当新项目添加到 Listview 时,我想保持在完全相同的位置,就像任何常规聊天应用程序一样。
这是添加消息的方法:
@Override
protected void onPostExecute(String json) {
if(json!=null){
...
//After Parse JSON ...
chatMessageAdapter.list.add(0,chatMessage); //add the message to the top of the list
chatMessageAdapter.notifyDataSetChanged(); //listview scrolls to the bottom afterwards
}
loading = false;
startApp = false;
}
我尝试了其他线程中的许多建议,但其中 none 确实有效。我希望有人能在这里提供帮助。
非常感谢。
对我有用的是:
// save index and top position
int index = mList.getFirstVisiblePosition();
View v = mList.getChildAt(0);
int top = (v == null) ? 0 : v.getTop();
// notify dataset changed or re-assign adapter here
// restore the position of listview
mList.setSelectionFromTop(index, top);
请注意,您必须从 xml 中删除 android:transcriptMode="normal",否则它将无法工作。