Android SearchView结合Filter实现列表检索功能使用总结

              


下面贴出主要代码:

<span style="font-size:14px;">
public class MainActivity extends FragmentActivity implements OnClickListener{
	public static SearchView mSearchView = null;
        public static ListView lv = null;
        private LazyAdapter adapter = null;

        @Override
	protected void onCreate(Bundle savedInstanceState) {
	super.onCreate(savedInstanceState);
	setContentView(R.layout.activity_main);
        lv = (ListView) this.findViewById(R.id.lv);
        adapter = new LazyAdapter(this, list);
        lv.setAdapter(adapter);</span><span style="font-size:14px;">

        mSearchView = (SearchView) findViewById(R.id.srv);
        mSearchView.setIconifiedByDefault(false);
        mSearchView.setSubmitButtonEnabled(false);
	mSearchView.setFocusable(true);
	mSearchView.setFocusableInTouchMode(true);
        /*
	mSearchView.requestFocus();
        mSearchView.clearFocus();
        mSearchView.onActionViewExpanded();
        */
        mSearchView.setOnQueryTextListener(new OnQueryTextListener() {
			@Override
			public boolean onQueryTextSubmit(String query) {
				return false;
			}
			@Override
			public boolean onQueryTextChange(String newText) {
				ListAdapter adapter = lv.getAdapter();
				if(adapter instanceof Filterable){
					Filter filter = ((Filterable)adapter).getFilter();
					if(newText==null || newText.length()==0){
						filter.filter(null);
					}else{
						filter.filter(newText);
					}
				}
				return true;
			}
		});
	}
	
	@Override
	protected void onResume() {
		mSearchView.setFocusable(true);
		mSearchView.setFocusableInTouchMode(true);
	//	mSearchView.requestFocus();   //获取焦点
		super.onResume();
	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		getMenuInflater().inflate(R.menu.main, menu);
		return true;
	}
	@Override
	public boolean onOptionsItemSelected(MenuItem item) {
		return super.onOptionsItemSelected(item);
	}
}

</span>

<span style="font-size:14px;">
public class LazyAdapter extends BaseAdapter implements Filterable{
    private Activity activity;
    private static LayoutInflater inflater=null;
    public ImageLoader imageLoader; 
    private List<Map<String, String>> list = null;
    private List<Map<String, String>> values = null;
    private MyFilter mFilter;
    private Object mLock = new Object();
    
    public LazyAdapter(Activity a, List<Map<String, String>> list) {
        this.activity = a;
        this.list = list;
        inflater = (LayoutInflater)activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        imageLoader=new ImageLoader(activity.getApplicationContext());
    }
    public int getCount() {
        return list.size();
    }
    public Object getItem(int position) {
        return position;
    }
    public long getItemId(int position) {
        return position;
    }
    @SuppressLint("InflateParams")
	public View getView(int position, View convertView, ViewGroup parent) {
        View vi=convertView;
        if(convertView==null){
            vi = inflater.inflate(R.layout.item_layout, null);	
        }
        TextView text = BaseViewHolder.get(vi, R.id.title);
        TextView fu_text = BaseViewHolder.get(vi, R.id.fu_title);
        ImageView image=BaseViewHolder.get(vi, R.id.iv);
        text.setText(list.get(position).get("title"));
        fu_text.setText(list.get(position).get("fu_title"));
        imageLoader.DisplayImage(list.get(position).get("src"), image);
        return vi;
    }

	@Override
	public Filter getFilter() {
		if(mFilter==null){
			mFilter = new MyFilter();
		}
		return mFilter;
	}
	class MyFilter extends Filter{
		@SuppressLint("DefaultLocale")
		@Override
		protected FilterResults performFiltering(CharSequence prefix) {
			FilterResults results = new FilterResults();
			if(values==null){
				synchronized (mLock) {
					values = new ArrayList<Map<String, String>>(list);
				}
			}
			if(prefix==null || prefix.length()==0){
				synchronized (mLock) {
					List<Map<String, String>> list1 = new ArrayList<Map<String, String>>(values);
					results.values = list1;
					results.count = list1.size();
				}
			}else{
				String prefixString = prefix.toString().toLowerCase();
				List<Map<String, String>> values1 = values;
				int count = values1.size();
				List<Map<String, String>> newValues = new ArrayList<Map<String, String>>(count);
				for(Map<String, String> value : values1){
					String title = value.get("title").toLowerCase();
					if(title.indexOf(prefixString) != -1){
						newValues.add(value);
					}
				}
				results.values = newValues;
				results.count = newValues.size();
			}
			return results;
		}
		@SuppressWarnings("unchecked")
		@Override
		protected void publishResults(CharSequence constraint,
				FilterResults results) {
			list = (List<Map<String,String>>) results.values;
			XinwenFragment.list = list;
			if(results.count>0){
				notifyDataSetChanged();
			}else{
				notifyDataSetInvalidated();
			}
		}
	}
}
 </span>


posted on   EvanLong  阅读(1099)  评论(0编辑  收藏  举报

编辑推荐:
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示