解决使用SearchView和Filter时出现搜索词悬浮窗问题
2013-10-31 16:18
567 查看
在andorid开发中,有时候会遇到这样的情况,界面中有一个SearchView,需要在其中输入内容来过滤ListView中的内容
大致的做法如下:
1. ListView的adpter实现Filterable接口
实现Filterable接口后该列表中的数据就可以按照规则过滤了。
2. 在Activity中为SearchView设定SearchView.OnQueryTextListener监听,在其回调方法中直接用如下代码实现对adapter数据源的过滤
这样用户在SearchView中输入string时,就可以按照之前adpter中设定的过滤规则来过滤,同时更新视图(在 Filter的publishResult方法中实现)。
上述的代码有一个问题:当用户在SearchView中输入字符时,确实可以过滤并更新列表,不过界面中始终有一个悬浮窗在显示过滤字符,在SearchView等类中均没有发现相关的方法去屏蔽掉该悬浮窗。
解决方法很简单,将过滤方法的调用从ListView交给filter本身就可以:
大致的做法如下:
1. ListView的adpter实现Filterable接口
/** * Adapter for exam/project list in session view. * */ public class SessionSimpleAdapter extends SimpleAdapter implements Filterable { private static final String TAG = "SessionSimpleAdapter"; private final Context mContext; /** * point to the data associated with the ListView, this should not be * changed, otherwise method "notifyDatasetChanged" would make no sense. */ private ArrayList<HashMap<String, String>> data; /** * store the whole data, be used to search matched data. */ private ArrayList<HashMap<String, String>> mOriginData; private int resource; private String[] from; private int[] to; private MyFilter myFilter; public SessionSimpleAdapter(Context context, List<? extends Map<String, ?>> data) { super(context, data, 0, new String[] {}, new int[] {}); this.mContext = context; this.data = (ArrayList<HashMap<String, String>>) data; this.mOriginData = new ArrayList<HashMap<String, String>>(this.data); } class ViewHolder { ImageView icon; TextView[] showTv; ProgressBar downloadProgressBar; } @Override public View getView(int position, View convertView, ViewGroup parent) { LayoutInflater inflater = ((Activity) mContext).getLayoutInflater(); HashMap<String, String> map = data.get(position); String type = map.get("type"); String uuid = map.get("uuid"); String title = map.get("name"); String description = map.get("description"); final ViewHolder holder; if (convertView == null) { Log.d(TAG, "convertView == null"); holder = new ViewHolder(); convertView = inflater.inflate(R.layout.material_item, null); holder.icon = (ImageView) convertView.findViewById(R.id.icon); holder.showTv = new TextView[2]; holder.showTv[0] = (TextView) convertView.findViewById(R.id.name); holder.showTv[1] = (TextView) convertView .findViewById(R.id.description); convertView.setTag(holder); } else { Log.d(TAG, "convertView != null"); holder = (ViewHolder) convertView.getTag(); } if (type.equals("p")) { holder.icon.setImageResource(R.drawable.project_icon); holder.showTv[0].setText("Project - " + map.get("name")); // need to clear the listener which might be associated with the // view last time. convertView.setOnClickListener(null); } else { holder.icon.setImageResource(R.drawable.exam_icon); holder.showTv[0].setText("Exam - " + map.get("name")); convertView.setOnClickListener(mExamListener); } holder.showTv[1].setText(map.get("description")); return convertView; } @Override public Filter getFilter() { if (myFilter == null) { myFilter = new MyFilter(); } return myFilter; } class MyFilter extends Filter { @Override protected FilterResults performFiltering(CharSequence constraint) { FilterResults results = new FilterResults(); // filter the origin data to get result. ArrayList<HashMap<String, String>> newResult = new ArrayList<HashMap<String, String>>(); for (Iterator iterator = mOriginData.iterator(); iterator.hasNext();) { HashMap<String, String> hashMap = (HashMap<String, String>) iterator .next(); if (hashMap.get("name").contains(constraint) || hashMap.get("description").contains(constraint)) { newResult.add(hashMap); } } results.values = newResult; results.count = newResult.size(); return results; } @Override protected void publishResults(CharSequence constraint, FilterResults results) { data.clear(); data.addAll((Collection<? extends HashMap<String, String>>) results.values); Log.d(TAG, "search over, size:" + data.size()); if (results.count > 0) { notifyDataSetChanged(); } else { notifyDataSetInvalidated(); } } } private OnClickListener mExamListener = new OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(); intent.setClass(mContext, ExamActivity.class); mContext.startActivity(intent); } }; }
实现Filterable接口后该列表中的数据就可以按照规则过滤了。
2. 在Activity中为SearchView设定SearchView.OnQueryTextListener监听,在其回调方法中直接用如下代码实现对adapter数据源的过滤
@Override public boolean onQueryTextChange(String newText) { if (TextUtils.isEmpty(newText)) { mMaterialListView.clearTextFilter(); } else { mMaterialListView.setFilterText(newText.toString()); } return true; }
这样用户在SearchView中输入string时,就可以按照之前adpter中设定的过滤规则来过滤,同时更新视图(在 Filter的publishResult方法中实现)。
上述的代码有一个问题:当用户在SearchView中输入字符时,确实可以过滤并更新列表,不过界面中始终有一个悬浮窗在显示过滤字符,在SearchView等类中均没有发现相关的方法去屏蔽掉该悬浮窗。
解决方法很简单,将过滤方法的调用从ListView交给filter本身就可以:
@Override public boolean onQueryTextChange(String newText) { if (TextUtils.isEmpty(newText)) { mMaterialListView.clearTextFilter(); } else { // below code committed will lead to a popup window when entering // search word, use the next line to work around the problem. // mMaterialListView.setFilterText(newText.toString()); adapter.getFilter().filter(newText); } return true; }
相关文章推荐
- SearchView setFilterText 关闭Toast 解决 SearchView 输入搜索词时出现悬浮窗
- Android使用VideoView出现无法播放此视频问题的解决方法
- Spring使用OpenSessionInViewFilter解决Hibernate的lazy延时加载问题
- 使用View.getWidth()方法出现的问题及解决方法
- iOS 开发之使用CocoaPods更新第三方出现“HEADER_SEARCH_PATHS `OTHER_LDFLAGS`……”问题解决方案
- 使用WebView加载数据出现找不到网页的问题之解决办法(转)
- Android开发之如何在WebView中点击链接使用自身打开(解决出现的选择使用第三方应用的问题)
- 使用OpenSessionInViewFilter解决懒加载问题
- android中通过添加view使用ViewPager出现的问题及解决方法
- 解决adapter中使用ViewHolder出现重复加载的问题
- 【android-view】searchView 的搜索按钮使用问题。
- Android WebView中使用loadData时出现的乱码问题解决办法
- Spring使用OpenSessionInViewFilter解决Hibernate的lazy延时加载问题
- 解决RecyclerView中使用UIL加载网络图片,在刷新时出现闪烁问题
- Spring与Hibernate整合中,使用OpenSessionInViewFilter后出现sessionFactory未注入问题
- Android 解决使用SearchView时软键盘不支持actionSearch的问题
- Spring使用OpenSessionInViewFilter解决Hibernate的lazy延时加载问题
- Android在开发中的使用技巧之解决ScrollView嵌套RecyclerView出现的系列问题
- Spring使用OpenSessionInViewFilter解决Hibernate的lazy延时加载问题
- Spring 和Struts2 整合 特别需要关注Session 关闭的问题:解决方法是使用 OpenSessionInViewFilter