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

时间:2014-01-28 18:42:40

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

是否可以在每个listview的项目上设置可见性监听器?喜欢:在用户看到项目时,做一些事情。在隐藏项目时,请执行其他操作。

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

另外,我的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) {}
});

2 个答案:

答案 0 :(得分: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.
}

答案 1 :(得分:2)

答案在你的问题中。

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

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

        }

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

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