EditText + Listview 字符串匹配适配器

写了个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()这个方法

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值