2012-12-07 42 views
4

我已经实现了一个列表视图,每个用户滚动到底部屏幕,它会自动添加新数据到列表视图 一旦滚动完成,onScroll()调用每个新项目进入显示从滚动开始到结束的视图。Android动态加载列表视图onScrollListener问题

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的机器人,所有变量firstVisibleItem ,visibleItemCount,totalItemCount始终等于0

那么这里发生了什么?

回答

15

要在你有firstVisibleItemvisibleItemCount工作在屏幕的底部检测的项目。我使用AsyncTask创建了一个demo example,它将在后台加载项目并更新UI。

总计firstVisibleItemvisibleItemCount会给你加载项目的数量,然后你可以实现加载更多项目的逻辑。

int loadedItems = firstVisibleItem + visibleItemCount; 
+1

反向滚动怎么办? –

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 
      } 
     } 

} 
+0

firstVisibleItem,visibleItemCount,totalItemCount仍然等于0,列表视图加载了5个items.I无法检测到最后一个可见项 – chinh

+0

编辑我的帖子。现在尝试 –

+0

如何使用pagenation将服务器数据加载到listview android与现有数据 – Harsha

1

上述的实现可能会导致边缘条件下的错误。页面中第一个可见项目&项目的总数可能比预期更多或更少。直到我切换到新的方法时,我才使用相同的东西。我所做的是实现了一个监听器的ListView的适配器,并在getview中检查if(position == totalItemCount中要显示的数组中的项目),如果是的话,我从适配器调用我的监听器。很简单