写了个Edittext + ListView 的搜索匹配显示。
用的是递归写了,最后项目说直接用数据库那边的搜索了,我这个就没用了,所以就发上来把。
/**
* Created by llsxily on 2015/9/2.
*/
public class NewGroupListVIewAdapter extends BaseAdapter implements Filterable{
Context context;
GroupFilter filter;
ArrayList<NewGroupListViewItem> mList = new ArrayList<NewGroupListViewItem>();
ArrayList<NewGroupListViewItem> resultList;
public NewGroupListVIewAdapter(Context context,ArrayList<NewGroupListViewItem> mList){
this.context = context;
this.mList = mList;
}
@Override
public int getCount() {
if(resultList == null )
resultList = mList;//防止空指针异常
return resultList.size();
}
@Override
public Object getItem(int position) {
return null;
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View view = View.inflate(context, R.layout.listitem_newgroup,null);
CircleImageView mHead = (CircleImageView)view.findViewById(R.id.imagview_newgroup_head);
TextView mName = (TextView)view.findViewById(R.id.tv_newgroup_name);
TextView mState = (TextView)view.findViewById(R.id.tv_newgroup_state);
CheckBox mChoise = (CheckBox)view.findViewById(R.id.chk_newgroup_choise);
mHead.setBackgroundResource(R.drawable.tiger);
mName.setText(resultList.get(position).getName());
mState.setText(resultList.get(position).getState());
mChoise.setChecked(resultList.get(position).isChoosed());
return view;
}
@Override
public Filter getFilter() {
if(filter == null){
filter = new GroupFilter(this.mList);
}
return filter;
}
//过滤器
private class GroupFilter extends Filter{
private ArrayList<NewGroupListViewItem> original;
public GroupFilter(ArrayList<NewGroupListViewItem> list){
original = list;
}
@Override
protected FilterResults performFiltering(CharSequence constraint) {
FilterResults results = new FilterResults();
if(constraint == null|| constraint.length() == 0){
results.values = original;
results.count = original.size();
}else {
ArrayList<NewGroupListViewItem> mList = new ArrayList<NewGroupListViewItem>();
for(int i = 0;i < original.size();i++){
NewGroupListViewItem p = original.get(i);
if(wordMatch(p.getName(),constraint,-1,0) != -1){
mList.add(p);
}
}
results.values = mList;
results.count = mList.size();
}
return results;
}
@Override
protected void publishResults(CharSequence constraint, FilterResults results) {
resultList = (ArrayList<NewGroupListViewItem>)results.values;
notifyDataSetChanged();
}
<span style="white-space:pre"> </span>//用了递归的匹配算法
private int wordMatch(String target,CharSequence a,int index,int now){
int x = target.indexOf(a.charAt(now));
if(x >= 0 && now < a.length() - 1){
return wordMatch(target.substring(x + 1), a, x, now + 1);
}else if(x >= 0 && now == a.length() -1){
return x;
}else {
return -1;
}
}
}
}
配套的,在EditText那边需要加上这个Watcher,顺便一体,这个监控不只是名字奇怪,还有添加的方法为
mText.addTextChangedListener(mGroupSearchWatcher);
也是蛮奇怪的,估计是早期起名字比较乱?
private TextWatcher mGroupSearchWatcher = new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
mAdapter.getFilter().filter(s);
}
@Override
public void afterTextChanged(Editable s) {
}
};
PS:对于文字的匹配我用了indexOf是因为需要做层层递进的匹配效果
如果不需要这种效果,只需要简单的整个字符串匹配可以直接使用a = s.contains(b);
或者需要从头开始匹配还有startWith()这个方法