github:https://github.com/zhangiqlin/TestSearchView
新鲜出炉的demo 代码有点乱 讲究着看吧。。。头晕。。
先看 想要实现的功能效果 :
第一步 数据初始化
第二步监听 输入框里面的 关键字 进行过滤 运用Filter 过滤
第三步 在自己的adapter类里面实现自己的 Filterable 接口 重写 getFilter()方法 返回自己的Filter对象
第四步 建立自己的Filter对象 并且在 performFiltering 方法里面实现你的过滤规则 完成以后返回filterResults 对象 publishResults 方法会接受到 performFiltering 方法返回的对象 然后更新listView 即可。
第五步 看代码
这里我使用了SearchView 用EdittextView 也可以。
先看MainActivity
public class MainActivity extends Activity {
SearchView searchview;
List<String> list = new ArrayList<String>();
private SearchView.SearchAutoComplete edit;
ListView listv;
MyAdapter<String> adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initData();
initView();
}
private void initView() {
// TODO Auto-generated method stub
searchview = (SearchView) findViewById(R.id.searchview);
listv = (ListView) findViewById(R.id.listv);
adapter = new MyAdapter<String>(this, list);
listv.setAdapter(adapter);
listv.setTextFilterEnabled(true);
searchview.setQueryHint("请输入你要查询的关键字");
searchview.setIconified(false);
searchview.setIconifiedByDefault(false);
searchview.setOnQueryTextListener(new OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String arg0) {
// TODO Auto-generated method stub
return false;
}
@Override
public boolean onQueryTextChange(String queryText) {
if (TextUtils.isEmpty(queryText)) {
adapter.getFilter().filter(null);
} else {
adapter.getFilter().filter(queryText);
}
return true;
}
});
}
private void initData() {
// TODO Auto-generated method stub
list.add("张三");
list.add("李思");
list.add("王麻子");
list.add("张三");
list.add("aaaa");
list.add("cccc");
list.add("dd");
list.add("qwe三");
list.add("2444");
list.add("vvvv");
list.add("55522");
list.add("667732f");
}
public class MyAdapter<T> extends BaseAdapter implements Filterable {
private Context context;
private ArrayList<T> mOriginalValues;
private List<T> mObjects;
private final Object mLock = new Object();
private LayoutInflater mInflater;
private String keyWrold = ""; // 关键字
public MyAdapter(Context context, List<T> list) {
this.context = context;
this.mObjects = list;
this.mInflater = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
@Override
public int getCount() {
// TODO Auto-generated method stub
if (mObjects == null || mObjects.size() == 0)
return 0;
return mObjects.size();
}
@Override
public Object getItem(int position) {
// TODO Auto-generated method stub
return null;
}
@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
ViewHolder viewHolder;
if (convertView == null) {
convertView = mInflater.inflate(R.layout.item, parent, false);
viewHolder = new ViewHolder();
viewHolder.txtv = (TextView) convertView.findViewById(R.id.txtv);
convertView.setTag(viewHolder);
} else {
viewHolder = (ViewHolder) convertView.getTag();
}
String str = mObjects.get(position).toString().toLowerCase();
if (!keyWrold.equals("")) {
String patten = "" + keyWrold;
Pattern p = Pattern.compile(patten);
Matcher m = p.matcher(str);
SpannableString spannableString = new SpannableString(str);
while (m.find()) {
if (str.contains(m.group())) {
spannableString.setSpan(
new ForegroundColorSpan(0xffec8b44), m.start(),
m.end(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
}
}
viewHolder.txtv.setText(spannableString);
} else {
SpannableString spannableString = new SpannableString(str);
spannableString.setSpan(new ForegroundColorSpan(Color.BLACK), 0,
str.length() - 1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
viewHolder.txtv.setText(mObjects.get(position).toString());
}
return convertView;
}
class ViewHolder {
TextView txtv;
}
@Override
public Filter getFilter() {
// TODO Auto-generated method stub
return filter;
}
Filter filter = new Filter() {
@Override
protected void publishResults(CharSequence constraint,
FilterResults results) {
mObjects = (List<T>) results.values;
if (results.count > 0) {
notifyDataSetChanged();
} else {
notifyDataSetInvalidated();
}
}
@Override
protected FilterResults performFiltering(CharSequence prefix) {
// TODO Auto-generated method stub
FilterResults filterResults = new FilterResults();
if (mOriginalValues == null) {
synchronized (mLock) {
mOriginalValues = new ArrayList<T>(mObjects);
}
}
if (prefix == null || prefix.length() == 0) {
ArrayList<T> list;
synchronized (mLock) {
list = new ArrayList<T>(mOriginalValues);
}
filterResults.values = list;
filterResults.count = list.size();
keyWrold = "";
} else {
String prefixString = prefix.toString().toLowerCase();
ArrayList<T> values;
synchronized (mLock) {
values = new ArrayList<T>(mOriginalValues);
}
final int count = values.size();
final ArrayList<T> newValues = new ArrayList<T>();
for (int i = 0; i < count; i++) {
final T value = values.get(i);
final String valueText = value.toString().toLowerCase();
// First match against the whole, non-splitted value
if (valueText.contains(prefixString)) {
newValues.add(value);
keyWrold = prefixString;
}
}
filterResults.values = newValues;
filterResults.count = newValues.size();
}
return filterResults;
}
};
}
创建一个自己的filter对象 实现自己的过滤规则 最后在publishResults方法里面更新listview , 如果需要给关键字加深颜色 注意看 getView keyWrold 的处理
凑合着看吧,有问题还望指出。