【问题标题】:Android dynamic loading list view onScrollListener issuesAndroid 动态加载列表视图 onScrollListener 问题
【发布时间】:2012-11-25 13:06:07
【问题描述】:

我已经实现了一个列表视图,每个用户滚动到底部屏幕,它会自动将新数据添加到列表视图 滚动完成后,从滚动开始到结束,每个进入显示视图的新项目都会调用 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

那么这里发生了什么?

【问题讨论】:

    标签: android listview scrollbar dynamic-loading


    【解决方案1】:

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

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

    int loadedItems = firstVisibleItem + visibleItemCount;
    

    【讨论】:

    • 反向滚动怎么样?
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:
          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
                  }
              }
      
      }
      

      【讨论】:

      • firstVisibleItem,visibleItemCount,totalItemCount 仍然等于 0,并且列表视图加载了 5 个项目。我无法检测到最后一个可见项目
      • 如何使用分页加载服务器数据到 listview android 与现有数据
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-23
      • 1970-01-01
      相关资源
      最近更新 更多