我想在列表底部添加来自Web服务的动态数据。当我向下滚动列表以显示较旧的消息并加载下一页时,列表应该刷新..但我的代码正在反向,即滚动顶部以加载下一页,我首先收到较旧的消息..这里是我的代码。 如果有人能帮忙......
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.conversations_activity);
mListView.setOnScrollListener(new OnScrollListener() {
int maxLoads = 30;
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
}
@Override
public void onScroll(AbsListView view, int firstVisibleItem,visibleItemCount, int totalItemCount) {
if ((totalItemCount - 1 > maxLoads)&& ((totalItemCount - 1) % maxLoads == 0)) {
System.gc();
}
if (((firstVisibleItem + visibleItemCount) == totalItemCount)
&& !isDataLoading && isScrollingEnable) {
new LoadNextPage(ConversationsActivity.this).execute();
}
}
});
new ConversationListTask(ConversationsActivity.this).execute();
}
}
private class ConversationListTask extends BaseAsyncTask {
@Override
protected void onPreExecute() {
super.onPreExecute();
}
public ConversationListTask(Activity activity) {
super(activity);
}
@Override
public void runDoInBackground() throws RuntimeException, Exception {
isDataLoading = true;
isScrollingEnable = false;
mPageNumber = 0;
try {
listMessage = APIProcessor.listMessage(ConversationsActivity.this, "1",
mPageNumber);
}
catch (Exception e) {
e.printStackTrace();
}
}
@Override
public void runOnPostExecute() {
isDataLoading = false;
isScrollingEnable = true;
convoListAdapter = new ConversationListAdapter(
ConversationsActivity.this, listMessage, urlThumbImageLoader);
mListViewConversation.setAdapter(convoListAdapter);
mListViewConversation.setSelection(mListViewConversation.getAdapter()
.getCount() - 1);
}
}
class LoadNextPage extends BaseAsyncTask {
public LoadNextPage(Activity activity) {
super(activity);
setDefaultProgressDialogStatus(false);
findViewById(R.id.list_loading_view).setVisibility(View.VISIBLE);
}
@Override
public void runDoInBackground() throws RuntimeException, Exception {
isDataLoading = true;
tempList = APIProcessor.listMessage(ConversationsActivity.this, "1",
mPageNumber + 1);
}
@Override
public void runOnPostExecute() {
new LoadNextPage(ConversationsActivity.this).execute();
findViewById(R.id.list_loading_view).setVisibility(View.GONE);
isDataLoading = false;
if (tempList == null || tempList.isEmpty() || listMessage == null
|| listMessage.isEmpty()) {
}
else {
mPageNumber++;
for (int i = 0; i < tempList.size(); i++) {
listMessage.add(tempList.get(i));
}
convoListAdapter.notifyDataSetChanged();
}
}
}
答案 0 :(得分:0)
您可以参考see this link
可能你错过了
int currentPosition = lv.getFirstVisiblePosition();
lv.setSelectionFromTop(currentPosition + 1, 0);
答案 1 :(得分:0)
我概述了我在你的代码中看到的内容:
在ConversationListTask.runOnPostExecute
方法上检索列表项。创建一个适配器并将其设置为listView。然后将列表的选择设置为最后一项。这会触发滚动到最后一个元素,并且您的scrolledToBottom条件变为true,然后LoadNextPage
任务立即启动。当我对你的问题发表评论时,在你第一次调用LoadNextPage
之后,它将在其post执行时创建并执行它的另一个实例,并在每个post执行时重复它,这将导致一个无限的调用。
首先,再次组织您的代码。如果您不想在将适配器设置为listView后将选择设置为bottom,请从ConversationListTask.runOnPostExecute
中删除此代码:
mListViewConversation.setSelection(mListViewConversation.getAdapter().getCount() - 1);
并在LoadNextPage任务的每个postExecute上停止调用LoadNextPage。
*顺便说一句,您正在onScroll
上正确收听scrolledToBottom事件。我使用类似的OnScrollListener
实现,如果你愿意,可以分享。