使用自定义的Adapter
1.[代码][Java]代码
package org.load.searchView;
import java.util.ArrayList;
import java.util.List;
import android.app.Activity;
import android.os.Bundle;
import android.support.v4.view.MenuItemCompat;
import android.text.TextUtils;
import android.view.Menu;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.BaseAdapter;
import android.widget.Filter;
import android.widget.Filterable;
import android.widget.ListView;
import android.widget.SearchView;
import android.widget.Toast;
import android.widget.SearchView.OnQueryTextListener;
import android.widget.TextView;
public class MainActivity extends Activity {
private List mData = new ArrayList(); // 这个数据会改变
private List mBackData; // 这是原始的数据
private ListView mListView;
private SearchView mSearchView;
private MyAdapter mAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mListView = (ListView) super.findViewById(R.id.list);
mListView.setTextFilterEnabled(true);
mListView.setOnItemClickListener(new ItemClick());
initData();
mAdapter = new MyAdapter();
mListView.setAdapter(mAdapter);
}
// 必须实现Filterable接口
private class MyAdapter extends BaseAdapter implements Filterable {
private MyFilter mFilter;
@Override
public int getCount() {
return mData.size();
}
@Override
public Object getItem(int position) {
return mData.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if (null == convertView) {
convertView = View.inflate(MainActivity.this, R.layout.item,
null);
}
TextView show = (TextView) convertView.findViewById(R.id.show);
show.setText(mData.get(position));
return convertView;
}
@Override
public Filter getFilter() {
if (null == mFilter) {
mFilter = new MyFilter();
}
return mFilter;
}
// 自定义Filter类
class MyFilter extends Filter {
@Override
// 该方法在子线程中执行
// 自定义过滤规则
protected FilterResults performFiltering(CharSequence constraint) {
FilterResults results = new FilterResults();
List newValues = new ArrayList();
String filterString = constraint.toString().trim()
.toLowerCase();
// 如果搜索框内容为空,就恢复原始数据
if (TextUtils.isEmpty(filterString)) {
newValues = mBackData;
} else {
// 过滤出新数据
for (String str : mBackData) {
if (-1 != str.toLowerCase().indexOf(filterString)) {
newValues.add(str);
}
}
}
results.values = newValues;
results.count = newValues.size();
return results;
}
@Override
protected void publishResults(CharSequence constraint,
FilterResults results) {
mData = (List) results.values;
if (results.count > 0) {
mAdapter.notifyDataSetChanged(); // 通知数据发生了改变
} else {
mAdapter.notifyDataSetInvalidated(); // 通知数据失效
}
}
}
}
// 搜索文本监听器
private class QueryListener implements OnQueryTextListener {
// 当内容被提交时执行
@Override
public boolean onQueryTextSubmit(String query) {
return true;
}
// 当搜索框内内容发生改变时执行
@Override
public boolean onQueryTextChange(String newText) {
if (TextUtils.isEmpty(newText)) {
mListView.clearTextFilter(); // 清楚ListView的过滤
} else {
mListView.setFilterText(newText); // 设置ListView的过滤关键词
}
return true;
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main, menu);
// 获取Menu中searchView组件
mSearchView = (SearchView) MenuItemCompat.getActionView(menu
.findItem(R.id.search));
// 设置监听器
mSearchView.setOnQueryTextListener(new QueryListener());
return true;
}
private void initData() {
for (int i = 0; i < 50; i++) {
mData.add("hello android " + i);
}
mBackData = mData;
}
private class ItemClick implements OnItemClickListener {
@Override
public void onItemClick(AdapterView> parent, View view, int position,
long id) {
Toast.makeText(MainActivity.this, mData.get(position),
Toast.LENGTH_SHORT).show();
}
}
}
2.[图片] 1.png
3.[图片] 2.png
4.[图片] 3.png