Android输入框实时模糊搜索

绝地灬酷狼 2023-03-05 03:10 107阅读 0赞

Android输入框实时模糊搜索

很多开发场景会用到搜索框实时模糊搜索来帮助用户输入内容,如图

模糊搜索效果

思路是在EditText 字符变动的时候 弹出ListPopupwindow并更新列表,这样的做法google已经封装为AutoCompleteTextView

用法

  1. mAutoCompleteTextView.setAdapter(adapter);
  2. mAutoCompleteTextView.setFocusable(true);
  3. mAutoCompleteTextView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
  4. @Override
  5. public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
  6. }
  7. });

adapter自定义
Adapter 继承 BaseApdater 需要实现 Filterable 接口

  1. private class SearchAdapter extends BaseAdapter implements Filterable {
  2. private Context mContext;
  3. public SearchAdapter(Context context) {
  4. super();
  5. this.mContext = context;
  6. }
  7. @Override
  8. public int getCount() {
  9. if (mSearchCustomEntities == null) {
  10. return 0;
  11. } else {
  12. return mSearchCustomEntities.size();
  13. }
  14. }
  15. @Override
  16. public Object getItem(int position) {
  17. if (mSearchCustomEntities == null) {
  18. return null;
  19. } else {
  20. return mSearchCustomEntities.get(position);
  21. }
  22. }
  23. @Override
  24. public long getItemId(int position) {
  25. return position;
  26. }
  27. @Override
  28. public View getView(int position, View convertView, ViewGroup parent) {
  29. ViewHolder holder = null;
  30. if (convertView == null) {
  31. holder = new ViewHolder();
  32. convertView = LayoutInflater.from(mContext).inflate(R.layout.item_search_custom, null, false);
  33. holder.tag = (TextView) convertView.findViewById(R.id.tv_custome_type);
  34. holder.name = (TextView) convertView.findViewById(R.id.custom_name);
  35. holder.phone = (TextView) convertView.findViewById(R.id.tv_phone);
  36. convertView.setTag(holder);
  37. } else {
  38. holder = (ViewHolder) convertView.getTag();
  39. }
  40. holder.phone.setText(mSearchCustomEntities.get(position).phone);
  41. holder.name.setText(mSearchCustomEntities.get(position).name);
  42. if (mSearchCustomEntities.get(position).type == CustomerType.TEMPORARY_CUSTOMER.getType()) {
  43. holder.tag.setVisibility(View.VISIBLE);
  44. holder.tag.setText(mContext.getString(R.string.tag_temp));
  45. holder.tag.setTextColor(mContext.getResources().getColor(R.color.customer_temp_txt));
  46. holder.tag.setBackground(mContext.getResources().getDrawable(R.drawable.bg_solid_quote_type_inner_temp));
  47. } else if (mSearchCustomEntities.get(position).type == CustomerType.COLLECTIVE_UNIT.getType()) {
  48. holder.tag.setVisibility(View.VISIBLE);
  49. holder.tag.setText(mContext.getString(R.string.tag_unit));
  50. holder.tag.setTextColor(mContext.getResources().getColor(R.color.customer_unit_txt));
  51. holder.tag.setBackground(mContext.getResources().getDrawable(R.drawable.bg_solid_quote_type_inner_unit));
  52. } else if (mSearchCustomEntities.get(position).type == CustomerType.OUTER_MOTORCADE.getType()) {
  53. holder.tag.setVisibility(View.VISIBLE);
  54. holder.tag.setText(mContext.getString(R.string.tag_car));
  55. holder.tag.setTextColor(mContext.getResources().getColor(R.color.customer_car_txt));
  56. holder.tag.setBackground(mContext.getResources().getDrawable(R.drawable.bg_solid_quote_type_inner_car));
  57. } else {
  58. holder.tag.setVisibility(View.GONE);
  59. }
  60. return convertView;
  61. }
  62. @Override
  63. public Filter getFilter() {
  64. if (mFilter == null) {
  65. mFilter = new ArrayFilter();
  66. }
  67. return mFilter;
  68. }
  69. private class ViewHolder {
  70. TextView tag;
  71. TextView name;
  72. TextView phone;
  73. }

自定义 过滤器

  1. private class ArrayFilter extends Filter {
  2. @Override
  3. protected FilterResults performFiltering(CharSequence prefix) {
  4. FilterResults results = new FilterResults();
  5. String prefixString = prefix.toString();
  6. //筛选部分 访问接口
  7. XbcClient.getCustomList(prefixString, new EntitiesObserver<SearchCustomEntity>() {
  8. @Override
  9. protected void onGot(List<SearchCustomEntity> entities, String msg, int errCode) {
  10. if (entities != null && entities.size() > 0) {
  11. mSearchCustomEntities.clear();
  12. mSearchCustomEntities.addAll(entities);
  13. mSearchAdapter.notifyDataSetChanged();
  14. }else{
  15. if (mSearchCustomEntities!=null & mSearchCustomEntities.size()>0) {
  16. mSearchCustomEntities.clear();
  17. mSearchAdapter.notifyDataSetInvalidated();
  18. }
  19. }
  20. }
  21. });
  22. results.values = mSearchCustomEntities;
  23. results.count = mSearchCustomEntities.size();
  24. return results;
  25. }

发表评论

表情:
评论列表 (有 0 条评论,107人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Android 模糊搜索

           在Android移动端开发过程中,列表展示是咱们经常使用的一种展现方式。这个时候就可能有如下情况出现了,比如说现在咱们列表里面的项还是相当可观的,而且咱们只想快速