【问题标题】:ListView (Adapter) item visibility listenerListView(适配器)项目可见性监听器
【发布时间】:2014-02-20 06:07:25
【问题描述】:

是否可以在每个列表视图的项目上设置一个可见性监听器?喜欢:用户看到该项目,做某事。如果项目被隐藏,请执行其他操作。

我想检查一个项目何时“进入”或“退出”滚动,以便更新第二个列表。

另外,我的 ListView 可能会扩展为:

adapter.addAll(  (Collection<? extends DBObject>) events);
adapter.notifyDataSetChanged();

我认为一种方法可能是使用全局侦听器来检查项目,但如果我向 ListView(上图)添加更多项目,我担心它会变得一团糟。我还没有完成任何事情

eventList.setOnScrollListener(new OnScrollListener() {

        public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {

        }

        @Override
        public void onScrollStateChanged(AbsListView view, int scrollState) {}
});

【问题讨论】:

    标签: android android-listview android-arrayadapter android-adapter


    【解决方案1】:

    您可以使用 onScroll 函数来计算。

    eventList.setOnScrollListener(new OnScrollListener() {
        int oldFirstVisibleItem = 0;
        int oldLastVisibleItem = 0;
    
        public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
            if (firstVisibleItem > oldFirstVisibleItem) {
                for(int i = oldFirstVisibleItem; i < firstVisibleItem; i++) {
                    onExit(i);
                }
            }
            if (firstVisibleItem < oldFirstVisibleItem) {
                for(int i = firstVisibleItem; i < oldFirstVisibleItem; i++) {
                    onEnter(i);
                }
            }
    
            int lastVisibleItem = firstVisibleItem + visibleItemCount - 1;
            if (lastVisibleItem < oldLastVisibleItem) {
                for(int i = oldLastVisibleItem+1; i <= lastVisibleItem; i++) {
                    onExit(i);
                }
            } 
            if (lastVisibleItem > oldLastVisibleItem) {
                for(int i = oldLastVisibleItem+1; i <= lastVisibleItem; i++) {
                    onEnter(i);
                }
            } 
    
            oldFirstVisibleItem = firstVisibleItem;
            oldLastVisibleItem = lastVisibleItem;
        }
    
        @Override
        public void onScrollStateChanged(AbsListView view, int scrollState) {}
    });
    
    public void onEnter(int position) {
        // Handle an item coming into view.
    }
    
    public void onExit(int position) {
        // Handle an item going out of view.
    }
    

    【讨论】:

      【解决方案2】:

      答案就在你的问题中。

      您在 onScrollListener() 中覆盖的方法之一是

      public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
      
              }
      

      传递的参数包括firstVisibleItemvisibleItemCount。您可以使用这两个数字来确定当前可见的项目。

      请记住,滚动时会经常调用 onScroll。

      【讨论】:

        猜你喜欢
        • 2013-08-20
        • 2018-02-17
        • 2018-12-27
        • 1970-01-01
        • 1970-01-01
        • 2012-06-24
        • 1970-01-01
        • 1970-01-01
        • 2019-01-15
        相关资源
        最近更新 更多