private List<Map<String, Object>> cityList;
adapter = new FilterAdapter(getContext(), cityList);//
adapter.getFilter().filter( "bj");
adapter.setFilterType(FilterAdapter.FILTER_BODY);
lvCitys.setAdapter(adapter);



public class FilterAdapter extends BaseAdapter implements Filterable {

public static final int FILTER_HEAD = 0;// 从头开始过滤
public static final int FILTER_FOOT = 1;// 从后开始过滤
public static final int FILTER_BODY = 2;// 任意过滤

private Context context;
List<Map<String, Object>> cityList;
private List<String> list = new ArrayList<String>();
private List<String> spylist = new ArrayList<String>();
private boolean needSort = false;// 是否需要排序
private ArrayFilter filter;// 过滤器
private int filterType = FILTER_BODY;// 过滤类别,默认从头开始过滤
private Event mFilterFinish = new Event(EventType.FILTER_CITY_FINISH);
private Event choseCity = new Event(EventType.CHOSE_CITY);

public FilterAdapter(Context context, List<Map<String, Object>> obj) {
this.context = context;
cityList = obj;
for (int i = 0; i < obj.size(); i++) {
this.list.add(obj.get(i).get("name").toString());
this.spylist.add(obj.get(i).get("spy").toString());
}
}

// 返回false后Item间的分割线消失
@Override
public boolean areAllItemsEnabled() {
return false;
}

// 带有“-”的不可操作,通常和areAllItemsEnabled一起使用。
@Override
public boolean isEnabled(int position) {
if( position >= list.size())
{
return false;
}
return !list.get(position).startsWith("-");// 此处根据需求灵活处理
}

public int getCount() {
return list.size();
}

public Object getItem(int position) {
return list.get(position);
}

public long getItemId(int position) {
return position;
}

public View getView(int position, View convertView, ViewGroup parent) {
View v;
final int p = position;
if (convertView == null) {
v = LayoutInflater.from(context).inflate(
R.layout.list_tip_item, parent, false);
} else {
v = convertView;
}

TextView tv = (TextView)v.findViewById(R.id.list_item_tip);
if(tv != null)
tv.setText(list.get(position));
v.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View arg0) {
String name = list.get(p);
int code = getAdminCodeByName(name);
if (code != 0) {
SearchMod.Instance().setSearchAdminName(name);
SearchMod.Instance().setSearchAdminCode(code);
}

String spy = getAdminSpyByName(name);

_Admin admin = new _Admin(name, spy, code);
AdminManager am = new AdminManager();
if (am != null)
am.insert(admin);
choseCity.addParam("cityname", name);
EventManager.trigger(choseCity);
}
});
return v;
}

private String getAdminSpyByName(String name) {
String spy = null;
for (int i = 0; i < cityList.size(); i++) {
if (cityList.get(i).get("name").toString().equals(name)) {
spy = cityList.get(i).get("spy").toString();
break;
}
}
return spy;
}

private int getAdminCodeByName(String name) {
int code = 0;
for (int i = 0; i < cityList.size(); i++) {
if (cityList.get(i).get("name").toString().equals(name)) {
code = (Integer) cityList.get(i).get("id");
break;
}
}
return code;
}
public List<String> getList() {
return list;
}

public void setList(List<String> list) {
this.list = list;
}

public boolean isNeedSort() {
return needSort;
}

public void setNeedSort(boolean needSort) {
this.needSort = needSort;
}

private List<String> dosort(List<String> list) {
Collections.sort(list, comparator);
return list;
}

private Comparator<String> comparator = new Comparator<String>() {
private final Collator collator = Collator.getInstance();

public int compare(String s1, String s2) {
return collator.compare(s1, s2);
}
};

@Override
public Filter getFilter() {
// TODO Auto-generated method stub
if (filter == null) {
filter = new ArrayFilter();
}
return filter;
}

public int getFilterType() {
return filterType;
}

public void setFilterType(int filterType) {
this.filterType = filterType;
}

private class ArrayFilter extends Filter {

@Override
protected FilterResults performFiltering(CharSequence prefix) {
// TODO Auto-generated method stub
FilterResults results = new FilterResults();
if (prefix == null || prefix.length() == 0) {// 没有过滤符就不过滤
// new
// ArrayList<String>()表示让ListView一开始的时候什么都没有,而不是全部显示到ListView中
// new ArrayList<String>(list)表示一开始就让Item全部显示到ListView中
ArrayList<String> l = new ArrayList<String>(list);
results.values = l;
results.count = l.size();
} else {

String prefixString = prefix.toString().toUpperCase();
Log.i("FilterAdapter", "prefixString = " + prefixString);

final ArrayList<String> values = new ArrayList<String>(list);

final int count = values.size();

ArrayList<String> newValues = new ArrayList<String>(list);

for (int i = 0; i < count; i++) {
final String value = values.get(i);// 原始字符串
final String valueText = value.toString().toLowerCase();
final String spy = spylist.get(i).toString();
Log.i("FilterAdapter", "value = " + value);
Log.i("FilterAdapter", "valueText = " + valueText);
Log.i("FilterAdapter", "spy = " + spy);

// 匹配核心代码,需要自己实现,这里只提供了基本的过滤类型
switch (filterType) {
case FILTER_HEAD:
if (!valueText.startsWith(prefixString)) {// 过滤掉不需要的项
newValues.remove(value);
Log.i("FilterAdapter", "remove FILTER_HEAD " + value + ",lenght = " + newValues.size());
}
break;
case FILTER_FOOT:
if (!valueText.endsWith(prefixString)) {// 过滤掉不需要的项
newValues.remove(value);
Log.i("FilterAdapter", "remove FILTER_FOOT " + value + ",lenght = " + newValues.size());
}
break;
case FILTER_BODY:
if (spy.indexOf(prefixString) == -1 && valueText.indexOf(prefixString) == -1) {
newValues.remove(value);
Log.i("FilterAdapter", "remove FILTER_BODY " + value + ",lenght = " + newValues.size());
} /*else if (valueText.indexOf(prefixString) != -1) {// 过滤掉不需要的项
newValues.add(value);
Log.i("FilterAdapter", "add FILTER_BODY valueText " + value + ",lenght = " + newValues.size());
}*/
break;

default:
break;
}
Log.i("FilterAdapter", "newValues.size() = " + newValues.size());
}

results.values = newValues;
results.count = newValues.size();
Log.i("FilterAdapter", "newValues.size() = " + newValues.size() +", results.count = " + results.count);
}

return results;
}

@Override
protected void publishResults(CharSequence constraint,
FilterResults results) {
// TODO Auto-generated method stub
list = (List<String>) results.values;
/*if (results.count > 0) {
notifyDataSetChanged();
} else {
notifyDataSetInvalidated();
}*/
EventManager.trigger(mFilterFinish);
}

}
}

更多相关文章

  1. 意图过滤器捕获所有共享意图
  2. android 检测字符串是否为合法域名
  3. Android 字符串资源
  4. 算法 - 给出一个字符串str,输出包含两个字符串str的最短字符串,如
  5. java中 16进制字符串 与普通字符串 与 byte数组 之间的转化
  6. 忽略转义字符时拆分字符串
  7. 使用字符串参数调用AndroidJni静态方法。
  8. java中匹配字符串中的中文字符(含中文标点的)
  9. FilenameFilter文件名过滤器使用实例

随机推荐

  1. android中Spinner特效
  2. Android面试系列文章2018之Java部分类加
  3. 深入分析Android(安卓)(build/core/*.mk
  4. Android(安卓)实现颜色渐变的一个小 tip
  5. Android中的文件扫描
  6. 在DDMS中FileExplore下什么都没有
  7. Android(安卓)java.lang.NoClassDefFound
  8. 11、从头学Android之Android布局管理:Line
  9. ListView 使用技巧
  10. Android(安卓)WiFi Direct文件传输