我已经实现了一个列表视图,每个用户滚动到底部屏幕,它会自动将新数据添加到列表视图 滚动完成后,onScroll()会调用从滚动开始到结束进入显示视图的每个新项目。
lv_best = (ListView) findViewById(R.id.lv_best);
bestadapter = new LazyAdapter(this, lst_tab_best);
lv_best.setAdapter(bestadapter);
lv_best.setOnScrollListener(new AbsListView.OnScrollListener() {
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) { }
@Override
public void onScroll(AbsListView view, int firstVisibleItem,
int visibleItemCount, int totalItemCount) {
Log.d("onScroll ", firstVisibleItem+"-"+visibleItemCount+"-"+totalItemCount);
boolean loadMore = firstVisibleItem + visibleItemCount >= totalItemCount;
if(loadMore){
new ChangeTab_best().execute();
}
}
});
我在模拟器中运行,列出上面显示的5个项目 但是我无法检测到ListView中滚动的结束,ChangeTab_best()被多次调用。当我看到Logcat android时,所有变量firstVisibleItem,visibleItemCount,totalItemCount总是等于0
那么这里发生了什么?
答案 0 :(得分:15)
要检测屏幕底部的项目,您必须使用firstVisibleItem
和visibleItemCount
。我使用AsyncTask创建了一个demo example
,它将在后台加载项目并更新UI。
firstVisibleItem
和visibleItemCount
的总和将为您提供已加载的项目数,然后您可以实现加载更多项目的逻辑。
int loadedItems = firstVisibleItem + visibleItemCount;
答案 1 :(得分:1)
上述实现可能会在边缘条件下导致错误。第一个可见项目的总和&页面中的项目可能比预期多1个或更少。我使用相同的东西,直到我切换到一个新的方法。我所做的是实现了listview的适配器的监听器,并在getview中检查是否(要显示的数组中的items == totalItemCount项目),如果是,我从适配器调用我的监听器。非常简单
答案 2 :(得分:0)
lv_best.setOnScrollListener(new OnScrollListener() {
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
switch (scrollState) {
case OnScrollListener.SCROLL_STATE_IDLE:
// when list scrolling stops
manipulateWithVisibleViews(view);
break;
case OnScrollListener.SCROLL_STATE_TOUCH_SCROLL:
break;
case OnScrollListener.SCROLL_STATE_FLING:
break;
}
}
@Override
public void onScroll(AbsListView view, int firstVisibleItem,
int visibleItemCount, int totalItemCount) {
}
});
private void manipulateWithVisibleViews(AbsListView view){
int count = view.getChildCount(); // visible views count
int lastVisibleItemPosition = view.getLastVisiblePosition();
for (int i = 0; i < count; i++) {
View convertView = view.getChildAt(i);
// update views
}
}
}