public class MyProductAdapter extends BaseAdapter implements Filterable {
private Context mContext;
private final List<Product> mList;
private List<Product> mSearchList;
private LayoutInflater inflater;
public MyProductAdapter(Context context, List<Product> list) {
this.mContext = context;
this.mList = list;
this.mSearchList = new ArrayList<>(mList);
this.inflater = LayoutInflater.from(mContext);
}
/**
* 搜索框被清空后调用此方法显示所有商品
*/
public void showAllProduct() {
mSearchList = new ArrayList<>(mList);
notifyDataSetChanged();
}
@Override
public int getCount() {
return mSearchList.size();
}
@Override
public Object getItem(int position) {
return mSearchList.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder = null;
if(convertView == null) {
convertView = inflater.inflate(R.layout.my_product_list_item, null);
holder = new ViewHolder();
holder.img = (ImageView) convertView.findViewById(R.id.img);
holder.text = (TextView) convertView.findViewById(R.id.text);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
Product p = mSearchList.get(position);
holder.img.setImageResource(R.drawable.ic_launcher);
holder.text.setText(p.getName());
return convertView;
}
private static final class ViewHolder {
public ImageView img;
public TextView text;
}
private Filter mFilter = new Filter() {
@SuppressLint("DefaultLocale")
@Override
protected FilterResults performFiltering(CharSequence constraint) {
String str = constraint.toString().toLowerCase();
FilterResults results = new FilterResults();
List<Product> list = new ArrayList<Product>();
for(Product p : mList) {
if(p.getName().contains(str)) {
list.add(p);
}
}
results.values = list;
results.count = list.size();
return results;
}
@SuppressWarnings("unchecked")
@Override
protected void publishResults(CharSequence constraint,
FilterResults results) {
mSearchList.clear();
mSearchList.addAll((ArrayList<Product>)results.values);
if (results.count > 0) {
notifyDataSetChanged();
} else {
notifyDataSetInvalidated();
}
}
};
@Override
public Filter getFilter() {
return mFilter;
}
}
在activity中EditText添加监听:
et_search.addTextChangedListener(new TextWatcher() {
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
if(TextUtils.isEmpty(s)) {
btn_clear.setVisibility(View.INVISIBLE);
productAdapter.showAllProduct();
} else {
btn_clear.setVisibility(View.VISIBLE);
productAdapter.getFilter().filter(s);
}
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count,
int after) {
}
@Override
public void afterTextChanged(Editable s) {
}
});
继承Filterable以后,在activity中监听ListView中item按下事件,不能再用List<Product> mList,而应该使用getItem(int position)方法获取单个对象。