package com.hjx.personalcenter.adapter; import android.content.Context; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.Filter; import android.widget.Filterable; import android.widget.TextView; import com.hjx.personalcenter.R; import com.hjx.personalcenter.model.SchoolInfo; import java.util.ArrayList; import java.util.List; /** * Created by h on 2017/8/21. */ public class SchoolAdapter extends BaseAdapter implements Filterable { private List mDatas; ArrayList objects; private Context context; private final Object mLock = new Object(); private ArrayFilter mFilter; public SchoolAdapter(ArrayList objects, Context context) { this.objects = objects; this.context = context; } @Override public int getCount() { return objects.size(); } @Override public Object getItem(int position) { return position; } @Override public long getItemId(int position) { return position; } @Override public View getView(final int position, View convertView, ViewGroup parent) { ProvincesAdapter.ViewHolder holder = null; if (convertView == null) { convertView = View.inflate(context, R.layout.custom_adilog_school_list_items, null); holder = new ProvincesAdapter.ViewHolder(); holder.nameText = (TextView) convertView.findViewById(R.id.list_school_items); convertView.setTag(holder); } else { holder = (ProvincesAdapter.ViewHolder) convertView.getTag(); } holder.nameText.setText(objects.get(position).getSchoolName()); return convertView; } @Override public Filter getFilter() { if (mFilter == null) { mFilter = new ArrayFilter(); } return mFilter; } static class ViewHolder { TextView nameText; } private class ArrayFilter extends Filter { //执行刷选 @Override protected FilterResults performFiltering(CharSequence prefix) { FilterResults results = new FilterResults();//过滤的结果 //原始数据备份为空时,上锁,同步复制原始数据 if (objects == null) { synchronized (mLock) { objects = new ArrayList<>(mDatas); } } //当首字母为空时 if (prefix == null || prefix.length() == 0) { ArrayList list; synchronized (mLock) {//同步复制一个原始备份数据 list = new ArrayList<>(objects); } results.values = list; results.count = list.size();//此时返回的results就是原始的数据,不进行过滤 } else { String prefixString = prefix.toString().toLowerCase();//转化为小写 ArrayList values; synchronized (mLock) {//同步复制一个原始备份数据 values = new ArrayList<>(objects); } final int count = values.size(); final ArrayList newValues = new ArrayList<>(); for (int i = 0; i < count; i++) { final SchoolInfo.DataBean value = values.get(i);//从List中拿到User对象 // final String valueText = value.toString().toLowerCase(); final String valueText = value.getSchoolName().toString().toLowerCase();//User对象的name属性作为过滤的参数 // First match against the whole, non-splitted value if (valueText.startsWith(prefixString) || valueText.indexOf(prefixString.toString()) != -1) {//第一个字符是否匹配 newValues.add(value);//将这个item加入到数组对象中 } else {//处理首字符是空格 final String[] words = valueText.split(" "); final int wordCount = words.length; // Start at index 0, in case valueText starts with space(s) for (int k = 0; k < wordCount; k++) { if (words[k].startsWith(prefixString)) {//一旦找到匹配的就break,跳出for循环 newValues.add(value); break; } } } } results.values = newValues;//此时的results就是过滤后的List数组 results.count = newValues.size(); } return results; } //刷选结果 @Override protected void publishResults(CharSequence prefix, FilterResults results) { //noinspection unchecked mDatas = (List) results.values;//此时,Adapter数据源就是过滤后的Results if (results.count > 0) { notifyDataSetChanged();//这个相当于从mDatas中删除了一些数据,只是数据的变化,故使用notifyDataSetChanged() } else { /** * 数据容器变化 ----> notifyDataSetInValidated 容器中的数据变化 ----> notifyDataSetChanged */ notifyDataSetInvalidated();//当results.count<=0时,此时数据源就是重新new出来的,说明原始的数据源已经失效了 } } } }