我假设您知道如何在 ListView 之上使用 SearchView 创建 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 应用程序中做了类似的事情。