动态地在Refreshable Listview Android中添加数据?

时间:2013-10-26 09:57:45

标签: android android-listview

我想在列表底部添加来自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();
            }
        }

    }

2 个答案:

答案 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实现,如果你愿意,可以分享。