BaseAdapter使用Filter笔记

本文介绍了如何在Activity中为EditText添加监听,并在ListView使用BaseAdapter结合Filter进行数据过滤。重点在于强调在实现Filterable接口后,应当使用getItem(int position)获取ListView项的单个对象。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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)方法获取单个对象。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值