【发布时间】:2011-02-21 11:23:05
【问题描述】:
我正在从 Http 服务器加载一个列表视图,一次 20 个,在列表视图结束时,我想从服务器加载接下来的 20 个数据,这个过程将一直持续到数据在服务器中结束,我使用扩展 BaseAdapter 的类来填充前 20 个数据。我该怎么办??
【问题讨论】:
标签: android
我正在从 Http 服务器加载一个列表视图,一次 20 个,在列表视图结束时,我想从服务器加载接下来的 20 个数据,这个过程将一直持续到数据在服务器中结束,我使用扩展 BaseAdapter 的类来填充前 20 个数据。我该怎么办??
【问题讨论】:
标签: android
这看起来也是一个优雅的解决方案:http://benjii.me/2010/08/endless-scrolling-listview-in-android/
它还实现了AbsListView.OnScrollListener,并在当前滚动视图中剩余项目达到一定阈值时使用 AsyncTask 加载更多内容。
【讨论】:
(firstVisibleItem + visibleThreshold) 更改为(firstVisibleItem + visibleItemCount)。
好的,我已经看到这是一个常见问题,所以我制作了一个 SMALL LIBRARY 自定义加载更多并在 github 中拉刷新 ListView,请检查此在 here,一切都在存储库中得到了很好的解释。
【讨论】:
您可以实现AbsListView.OnScrollListener,它会获得通知并允许您加载更多数据。
参见例如
....
ListView.setOnScrollListener(this);
....
然后看看https://github.com/pilhuhn/ZwitscherA/blob/master/src/de/bsd/zwitscher/TweetListActivity.java#L287
或查看 sdk 示例中的 List9 example。
【讨论】:
Heiko Rupp 的代码是解决这个问题的最佳选择。
您唯一应该做的就是实现onScrollListener 和onScroll()
只需使用代码检查是否有列表结尾
boolean loadMore = firstVisibleItem + visibleItemCount >= totalItemCount-1;
如果 true 以常规方式加载您的数据..
感谢 Heiko Rupp 为这个 sn-p :)
【讨论】:
这是我用来在列表视图末尾加载更多数据的方法
listview.setOnScrollListener(new OnScrollListener(){
@Override
public void onScroll(AbsListView view,
int firstVisibleItem, int visibleItemCount,
int totalItemCount) {
//Algorithm to check if the last item is visible or not
final int lastItem = firstVisibleItem + visibleItemCount;
if(lastItem == totalItemCount){
// you have reached end of list, load more data
}
}
@Override
public void onScrollStateChanged(AbsListView view,int scrollState) {
//blank, not using this
}
});
【讨论】:
当我不小心尝试从非 UI 线程更新视图时,我遇到了这个问题。将 ui 更新代码推送到 ui 线程解决了我的问题!
Handler mainHandler = new Handler(Looper.getMainLooper());
mainHandler.post(new Runnable() {
@Override
public void run() {
// insert ui update code here
}
}
});
【讨论】: