我需要实现将从网站获取数据的自定义列表视图。当到达列表末尾时,将进行新的 api 调用。我不介意它是否继续在后台获取新数据并在到达列表结尾时显示它。
最好的方法是什么?
现在我已经创建了一个滚动视图。我进行 api 调用获取 10 条记录并从中创建一个线性布局并将其添加到滚动视图。我收听滚动,当它到达终点时,进行新的 api 调用并再次将其添加到滚动视图。但是它的性能不好,而且有时会冻结。
有什么更好的方法来实现这个吗?
我需要实现将从网站获取数据的自定义列表视图。当到达列表末尾时,将进行新的 api 调用。我不介意它是否继续在后台获取新数据并在到达列表结尾时显示它。
最好的方法是什么?
现在我已经创建了一个滚动视图。我进行 api 调用获取 10 条记录并从中创建一个线性布局并将其添加到滚动视图。我收听滚动,当它到达终点时,进行新的 api 调用并再次将其添加到滚动视图。但是它的性能不好,而且有时会冻结。
有什么更好的方法来实现这个吗?
事实上,我昨晚刚刚写了一篇关于这个的博客。它应该完全按照您的要求执行:http ://www.thekeyconsultant.com/2013/02/android-simple-endless-lists-with.html 。如果您需要任何澄清,请告诉我。
当加载数据集一半的视图时,该示例开始加载下一个数据集。这样,如果用户滚动缓慢,他们可能永远看不到列表的“结尾”。如果需要,您可以更改它,使其等到结束。
我建议检查滚动而不是使用适配器,因为您可以处理任意数量的项目(甚至是 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
}
它是滚动监听器的一个实现,它存储参数以防您需要实现分页查询,每次滚动到达底部时查找不同的十位。
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);
}
}
}
}