ListView(适配器)项可见性侦听器

Dio*_*lor 5 android android-arrayadapter android-listview android-adapter

是否可以在每个listview的项目上都有一个可见性监听器?喜欢:在用户看到项目时,做一些事情.项目被隐藏,做其他事情.

我想检查项目"进入"或"退出"滚动的时间,以便更新第二个列表.

另外我的ListView可能会扩展如下:

adapter.addAll(  (Collection<? extends DBObject>) events);
adapter.notifyDataSetChanged();
Run Code Online (Sandbox Code Playgroud)

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

eventList.setOnScrollListener(new OnScrollListener() {

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

        }

        @Override
        public void onScrollStateChanged(AbsListView view, int scrollState) {}
});
Run Code Online (Sandbox Code Playgroud)

Asw*_*ran 7

您可以使用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.
}
Run Code Online (Sandbox Code Playgroud)