我想实现一个具有搜索功能的活动,该搜索功能可以搜索列表视图的内容。搜索栏应该位于列表视图的顶部,当它向下滚动列表视图时,它应该向用户隐藏。当他在搜索某些东西时,它应该始终位于列表视图之上!我该如何实现它。 最诚挚的问候!
答案 0 :(得分:1)
我假设您知道如何使用SearchView在ListView上创建XML布局,它可以放在垂直LinearLayout内。棘手的部分是如何操纵SearchView,对吧?
您可以在ListView上注册一个侦听器,如下所示:
listView.setOnScrollListener(new AbsListView.OnScrollListener() {
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
switch (scrollState) {
case SCROLL_STATE_IDLE:
//scroll was stopped, let's show search bar again
break;
case SCROLL_STATE_TOUCH_SCROLL:
//user is scrolling, let's hide search bar
break;
}
}
@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
if (firstVisibleItem > 0) {
//user scrolled down, first element is hidden
}
}
});
如您所见,您将被告知状态更改,如果您想在触摸事件期间隐藏搜索视图,则可以使用它。或者,您可以倾听不断变化的可见元素。这个简单的if语句检查firstVisibleItem > 0
将告诉您用户何时向下滚动。您还可以跟踪消失的列表项,并在显示或隐藏任何项目时做出反应。
另一种监听滚动更改的方法是扩展ListView并覆盖onScrollChanged()
方法,例如
class MyListView extends ListView {
public MyListView(Context context) {
super(context);
}
public MyListView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public MyListView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
@Override
protected void onScrollChanged(int l, int t, int oldl, int oldt) {
super.onScrollChanged(l, t, oldl, oldt);
for (Callbacks c : mCallbacks) {
c.onScrollChanged(l - oldl, t - oldt);
}
}
@Override
public int computeVerticalScrollRange() {
return super.computeVerticalScrollRange();
}
public void addCallbacks(Callbacks listener) {
if (!mCallbacks.contains(listener)) {
mCallbacks.add(listener);
}
}
public static interface Callbacks {
public void onScrollChanged(int deltaX, int deltaY);
}
}
Google人员在IOSched app。
中做了类似的事情