MainActivity 采用 FramLayout布局 点击搜索菜单按钮,弹出半透明的搜索屏蔽层(不让下层获得事件焦点),并且展开搜索框
菜单中配置 含有SearchView控件的 anctionLayout
<item android:id="@+id/action_search" android:showAsAction="always" android:actionLayout="@layout/layout_searchview" android:title="@string/action_search" android:icon="@android:drawable/ic_menu_search" />
private void initView() { // 搜索屏蔽层 linearLayout_search = (LinearLayout) this.findViewById(R.id.LinearLayout_search); linearLayout_search.setVisibility(View.GONE); linearLayout_search.setOnTouchListener(new OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { // 没有查询输入,触及此屏蔽层,退出查询界面 if (searchView != null && searchView.getQuery().toString().isEmpty()) { searchView.setIconified(true);//折合搜索框 } return true;// 消耗事件 屏蔽事件向下层传递 } });
/** * 初始化 menu中的 搜索action */ private void initActionSearch(SearchView searchView) { if (searchView == null) { return; } // 搜索展开时 searchView.setOnSearchClickListener(new OnClickListener() { @Override public void onClick(View v) { linearLayout_search.setVisibility(View.VISIBLE); updateMenu(STATE_MENU_SEARCH); //清除 ListView 为NULL 时,提示的空视图 MainActivity.this.findViewById(R.id.textView_listview_empty).setVisibility(View.GONE); } }); // 搜索关闭 searchView.setOnCloseListener(new OnCloseListener() { @Override public boolean onClose() { //关闭屏蔽层 数据会自动清空 linearLayout_search.setVisibility(View.GONE); System.out.println("---onClose----"); updateMenu(STATE_MENU_PALYLIST); return false; } }); searchView.setOnQueryTextListener(new OnQueryTextListener() { @Override public boolean onQueryTextSubmit(String query) { return false; } @Override public boolean onQueryTextChange(String newText) { //搜索的实现,后面会详细说明 return false; } }); }
搜索ListView的相关设置:
布局
<LinearLayout android:id="@+id/LinearLayout_search" android:layout_width="fill_parent" android:layout_height="fill_parent" android:background="#7f717171" android:orientation="vertical" > <ListView android:id="@+id/listView_search" android:layout_width="match_parent" android:layout_height="wrap_content" > </ListView> <!-- ListView 为空的时候 显示的视图 --> <TextView android:id="@+id/textView_listview_empty" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="没有相关数据" android:visibility="gone"//gong 不显示 android:textAppearance="?android:attr/textAppearanceLarge" /> </LinearLayout>
listViewSearch.setEmptyView(this.findViewById(R.id.textView_listview_empty));//设置数据为null 时,显示的视图 // 播放列表层 listViewPlayList=(ListView)this.findViewById(R.id.listView_playlist); //ListView 尾视图 View view=getLayoutInflater().inflate(R.layout.layout_listview_foot, null); TextView footTextView=(TextView) view.findViewById(R.id.textView_foot); footTextView.setText("共有 "+adapterPlayList.getCount()+" 首歌曲"); //注意顺序 addFooterView 必须在 setAdapter前面 listViewPlayList.addFooterView(view); listViewPlayList.setAdapter(adapterPlayList);
listViewPlayList.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> arg0, View arg1, int id, long arg3) { if(id== -1) { // 点击的是headerView或者footerView return; } Toast.makeText(MainActivity.this, ((SongInfoBean)arg0.getAdapter().getItem(arg2)).getSourceString().trim(), 1000).show(); } });