ListView(适配器)项目可见性监听器

Posted

技术标签:

【中文标题】ListView(适配器)项目可见性监听器【英文标题】:ListView (Adapter) item visibility listener 【发布时间】: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) 
);

【问题讨论】:

【参考方案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。

【讨论】:

以上是关于ListView(适配器)项目可见性监听器的主要内容,如果未能解决你的问题,请参考以下文章

如何在android中去listview适配器项目点击监听器片段?

ListView项目文本是不可见的

ListView Item点击监听事件失效

Android-ListView两种适配器以及事件监听

Listview 中未触发 Onitemclick 侦听器

使用适配器中的 onClick 侦听器填充单选按钮组的 ListView