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)
传递的参数包括firstVisibleItem
和visibleItemCount
。您可以使用这两个数字来确定当前可见的项目。
请记住,滚动时会经常调用 onScroll。
【讨论】:
以上是关于ListView(适配器)项目可见性监听器的主要内容,如果未能解决你的问题,请参考以下文章