我正在尝试实现一些聊天功能。
消息必须按照从旧到新的顺序排序(新消息在底部,旧消息在我的ListView的顶部),为此我在我的布局上使用了android:transcriptMode="alwaysScroll"
和android:stackFromBottom="true"
。
当用户向上滚动ListView时,应该从我的SQL数据库中更新旧消息。这里是一些代码:
public void onLoadFinished(Loader loader, Object data) {
final Cursor cursor = (Cursor)data;
if(cursor.getCount() > API_REQUEST_COUNT) {
this.lsView.setStackFromBottom(false);
}
this.mAdapter.changeCursor(cursor);
if(this.mAdapter.getCount() > 0) {
this.isLoading = false;
}, 500);
}
}
这是我实现“加载更多”功能的方法:
this.lsView.setOnScrollListener(new AbsListView.OnScrollListener() {
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
}
@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
int currentItemPosition = totalItemCount - firstVisibleItem;
// TODO without refreshing cache :-(
if(totalItemCount == 0 && !isLoading) {
isLoading = true;
if(getLoaderManager().getLoader(loaderId) != null) {
getLoaderManager().restartLoader(loaderId, getArguments(), ConversationFragment.this);
} else {
getLoaderManager().initLoader(loaderId, getArguments(), ConversationFragment.this);
}
// TODO pagination
ApiManager.getInstance().getDialog(dialogId, pageNum);
}
if(!isLoading && totalItemCount != 0 && currentItemPosition == (API_REQUEST_COUNT * pageNum) - 1) {
pageNum++;
ApiManager.getInstance().getDialog(dialogId, pageNum);
}
}
});
问题是,当我更新适配器时,
ListView
会滚动到顶部,但我希望它停留在当前位置。有人能帮忙吗?