达到列表末尾时,在Android列表视图中自动加载数据

时间:2013-02-25 07:49:26

标签: android android-listview

我需要实现自定义列表视图,该视图将从网站获取数据。当达到列表的结尾时,进行新的api呼叫。我不介意它是否继续在后台获取新数据并在列表结束时显示它。

最好的方法是什么?

现在我已经创建了一个scrollview。我进行api调用获取10条记录并从中创建一个linearlayout并将其添加到scrollview。我听到卷轴,当它到达终点时,进行新的api调用并再次将其添加到scrollview。但它的表现并不好,而且有时会冻结。

有更好的方法来实现这个吗?

3 个答案:

答案 0 :(得分:2)

我实际上昨晚刚刚写了一篇博客。它应该完全按照你的要求去做:http://www.thekeyconsultant.com/2013/02/android-simple-endless-lists-with.html。如果您需要任何澄清,请告诉我。

当加载数据集中间的视图时,该示例开始加载下一个数据集。以这种方式,如果用户慢慢滚动,则用户可能永远不会看到列表的“结束”。如果需要,您可以更改它以便等到结束。

答案 1 :(得分:0)

我建议检查滚动而不是使用适配器,因为你可以处理任意数量的项目(甚至是0),并且还可以根据adapterView告诉它看到的内容自定义何时进行额外加载。

这是一个示例代码:

mAdapterView.setOnScrollListener(new OnScrollListener() 
  {
  ...
  @Override
  public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) 
    {
    final boolean needLoading =!mIsLoadingNewData&& firstVisibleItem + visibleItemCount >= mAdapter.getCount() - 1;
    mIsLoadingNewData=true;
    if(needLoading)
      //load the new data and then update the adapter with new data and then set mIsLoadingNewData to false
  }

答案 2 :(得分:0)

它是一个滚动侦听器的实现,它存储参数,以防您需要实现分页查询,每次滚动到达底部时查找不同的数字。

    private class ScrollListener implements AbsListView.OnScrollListener {

    private int currentScrollState;
    private int totalItemCount;
    private int currentVisibleItemCount;
    private boolean loading;
    private int pageSize = 10;
    private int offset = 0;

    public void setLoading(boolean loading) {
        this.loading = loading;
    }

    public int getPageSize() {
        return this.pageSize;
    }

    public int getOffset() {
        return this.offset;
    }

    @Override
    public void onScrollStateChanged(AbsListView view, int scrollState) {
        this.currentScrollState = scrollState;
        this.isScrollCompleted();
    }

    @Override
    public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
        this.currentVisibleItemCount = firstVisibleItem + visibleItemCount; // last item
        this.totalItemCount = totalItemCount;
    }

    private void isScrollCompleted() {
        if (this.currentVisibleItemCount > 0
                && this.totalItemCount - 1 == this.currentVisibleItemCount
                && this.currentScrollState == SCROLL_STATE_IDLE) {
            // Detect if there's been a scroll which has completed and load more
            if (!loading && preguntas.getAdapter() != null) {
                loading = true;
                offset += pageSize;
                loadMoreData(offset, pageSize);
            }
        }
    }
}