4

我已经实现了一个列表视图,每个用户滚动到底部屏幕,它会自动将新数据添加到列表视图滚动完成后,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

那么这里发生了什么?

4

3 回答 3

15

要检测屏幕底部的项目,您必须使用firstVisibleItemvisibleItemCount。我使用 AsyncTask 创建了一个demo example相同的对象,它将在后台加载项目并更新 UI。

Total offirstVisibleItemvisibleItemCount会给你加载的项目数,然后你可以实现加载更多项目的逻辑。

int loadedItems = firstVisibleItem + visibleItemCount;
于 2012-12-07T16:11:44.300 回答
1

上述实现可能会导致边缘条件下的错误。页面中第一个可见项目和项目的总和可能比预期多或少 1 个计数。在我改用新方法之前,我一直在使用相同的东西。我所做的是实现了一个listview适配器的侦听器,并在getview中检查是否(位置==要显示的数组中的项目的totalItemCount),如果是,我从适配器调用我的侦听器。非常简单

于 2013-04-18T08:50:19.197 回答
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
            }
        }

}
于 2012-12-07T11:10:54.713 回答