广告
返回顶部
首页 > 资讯 > 移动开发 >Android搜索框通用版
  • 681
分享到

Android搜索框通用版

android搜索框通用Android 2022-06-06 08:06:23 681人浏览 薄情痞子
摘要

之前项目总会遇到很多搜索框类的功能,虽然不是很复杂,不过每次都要去自己处理数据,并且去处理搜索框的变化,写起来也比较麻烦,今天来做一个比较简单的通用搜索栏。 先看下效果图:

之前项目总会遇到很多搜索框类的功能,虽然不是很复杂,不过每次都要去自己处理数据,并且去处理搜索框的变化,写起来也比较麻烦,今天来做一个比较简单的通用搜索栏。

先看下效果图:

简单效果图

没什么特别的,只是今天要做的就是简单的把搜索框的内容封装一下.

一、分析功能

先考虑一下,搜索框一般都是由一个搜索图标(一般都是一个放大镜),一个输入框和一个清除按钮组成.然后会通过监听输入框的变化去处理清除按钮的显示和隐藏并且去过滤相关的数据.最后去刷新适配器,显示过滤后的数据.基本上搜索框的功能都大同小异.
有了上边的分析,我们可以去提取出一个通用的搜索框布局,然后写一个自定义ViewGroup去处理相关的页面显示等问题.

二、具体实现

先来写一些自定的属性,方便之后使用,新建一个attr文件并定义自定义属性如下:


<?xml version="1.0" encoding="utf-8"?>
<resources>
  <!--搜索图标左边margin-->
  <attr name="SearchBarIconMarginLeft" fORMat="dimension"/>
  <!--搜索图标右边margin-->
  <attr name="SearchBarIconMarginRight" format="dimension"/>
  <!--搜索图标-->
  <attr name="SearchBarIconSrc" format="reference"/>
  <!--清除图标左边margin-->
  <attr name="ClearIconMarginLeft" format="dimension"/>
  <!--清除图标右边margin-->
  <attr name="ClearIconMarginRight" format="dimension"/>
  <!--清除图标-->
  <attr name="ClearIconSrc" format="reference"/>
  <!--搜索文字大小-->
  <attr name="SearchTextSize" format="dimension"/>
  <!--搜索文字颜色-->
  <attr name="SearchTextColor" format="color"/>
  <declare-styleable name="CommolySearchView">
    <attr name="SearchBarIconMarginLeft"/>
    <attr name="SearchBarIconMarginRight"/>
    <attr name="SearchBarIconSrc"/>
    <attr name="ClearIconMarginLeft"/>
    <attr name="ClearIconMarginRight"/>
    <attr name="ClearIconSrc"/>
    <attr name="SearchTextSize"/>
    <attr name="SearchTextColor"/>
  </declare-styleable>
</resources>

然后写一下搜索栏的布局searchview_layout.xml:


<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:Android="Http://schemas.android.com/apk/res/android"
       android:layout_width="match_parent"
       android:layout_height="match_parent"
       android:orientation="vertical">
  <LinearLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center_vertical"
    android:orientation="horizontal"
    >
    <ImageView
      android:id="@+id/iv_search_icon"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:layout_gravity="center_vertical"
      android:src="@mipmap/search_bar_icon"
      android:layout_marginRight="8dp"
      />
    <EditText
      android:id="@+id/et_search"
      android:layout_width="0dp"
      android:layout_height="match_parent"
      android:layout_weight="1"
      android:background="@null"
      android:singleLine="true"
      />
    <ImageView
      android:id="@+id/iv_search_clear"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:layout_gravity="center_vertical"
      android:src="@mipmap/search_clear_icon"
      android:visibility="Gone"
      />
  </LinearLayout>
</LinearLayout>

布局很简单,就是一个搜索图标加上一个输入框和一个清除图标,下边来写一下具体的实现,建立一个CommolySearchView继承自LinearLayout即可,先来定义一些属性,获取自定义属性并且绑定布局文件.代码如下:



public class CommolySearchView<T> extends LinearLayout {
  
  private Context mContext;
  
  private EditText mEditText;
  
  private ImageView mClearImg;
  
  private ImageView mSearchBarImg;
  
  private BaseAdapter mAdapter;
  
  private List<T> mDatas = new ArrayList<T>();
  
  private List<T> mDupDatas = new ArrayList<T>();
  
  private List<T> mFilterDatas = new ArrayList<T>();
  
  private List<T> mDupFilterDatas = new ArrayList<T>();
  
  private Bitmap mSearchIcon;
  
  private int mSearchIconMarginLeft;
  
  private int mSearchIconMarginRight;
  
  private Bitmap mClearIcon;
  
  private int mClearIconMarginLeft;
  
  private int mClearIconMarginRight;
  
  private int mSearchTextSize;
  
  private int mSearchTextColor;
  public CommolySearchView(Context context) {
    this(context, null);
  }
  public CommolySearchView(Context context, AttributeSet attrs) {
    this(context, attrs, 0);
  }
  public CommolySearchView(Context context, AttributeSet attrs, int defStyleAttr) {
    super(context, attrs, defStyleAttr);
    mContext = context;
    // 自定义属性
    TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.CommolySearchView);
    Drawable searchD = ta.getDrawable(R.styleable.CommolySearchView_SearchBarIconSrc);
    mSearchIcon = drawableToBitamp(searchD);
    mSearchIconMarginLeft = px2dip(context, ta.getDimensionPixelOffset(R.styleable.CommolySearchView_SearchBarIconMarginLeft, 0));
    mSearchIconMarginRight = px2dip(context, ta.getDimensionPixelOffset(R.styleable.CommolySearchView_SearchBarIconMarginRight, 0));
    Drawable clearD = ta.getDrawable(R.styleable.CommolySearchView_ClearIconSrc);
    mClearIcon = drawableToBitamp(clearD);
    mClearIconMarginLeft = px2dip(context, ta.getDimensionPixelOffset(R.styleable.CommolySearchView_ClearIconMarginLeft, 0));
    mClearIconMarginRight = px2dip(context, ta.getDimensionPixelOffset(R.styleable.CommolySearchView_ClearIconMarginRight, 0));
    mSearchTextSize = px2sp(context, ta.getDimensionPixelOffset(R.styleable.CommolySearchView_SearchTextSize, 0));
    mSearchTextColor = ta.getColor(R.styleable.CommolySearchView_SearchTextColor, 0);
    ta.recycle();
    // 绑定布局文件
    LayoutInflater.from(context).inflate(R.layout.searchview_layout, this);
    initView();
  }  

可以看到我们使用了泛型,目的是为了处理不同的数据源类型,接下来需要初始化控件,看一下initView方法:


  
  private void initView() {
    mEditText = (EditText) findViewById(R.id.et_search);
    mClearImg = (ImageView) findViewById(R.id.iv_search_clear);
    mSearchBarImg = (ImageView) findViewById(R.id.iv_search_icon);
    // 处理自定义属性
    if (0 != mSearchIconMarginLeft || 0 != mSearchIconMarginRight) {
      mSearchBarImg.setPadding(mSearchIconMarginLeft, 0, mSearchIconMarginRight, 0);
    }
    if (0 != mClearIconMarginLeft || 0 != mClearIconMarginRight) {
      mClearImg.setPadding(mClearIconMarginLeft, 0, mClearIconMarginRight, 0);
    }
    if (null != mSearchIcon) {
      mSearchBarImg.setImageBitmap(mSearchIcon);
    }
    if (null != mClearIcon) {
      mClearImg.setImageBitmap(mClearIcon);
    }
    if (0 != mSearchTextSize) {
      mEditText.setTextSize(mSearchTextSize);
    }
    if (0 != mSearchTextColor) {
      mEditText.setTextColor(mSearchTextColor);
    }
    // 清空按钮处理事件
    mClearImg.setOnClickListener(new OnClickListener() {
      @Override
      public void onClick(View view) {
      }
    });
    // 搜索栏处理事件
    mEditText.addTextChangedListener(new TextWatcher() {
      @Override
      public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
      }
      @Override
      public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
      }
      @Override
      public void afterTextChanged(Editable editable) {
      }
    });
  }

这样初始化控件的任务也完成了,下面就是处理具体逻辑的部分,我们打算在CommonlySearchView完成清除按钮的显示隐藏,编辑框内容的处理,对适配器进行刷新的功能,具体数据的筛选工作,使用一个回调接口,由使用者去进行筛选,只需要获取筛选后的数据即可,然后通过筛选后的数据,去刷新适配器来完成要实现的功能.所以要对外提供一些方法,来获取到适配器,及一些数据源.


  
  public void setDatas(List<T> datas) {
    if (null == datas) {
      return;
    }
    if (null != mDatas) {
      mDatas.clear();
    }
    if (null != mDupDatas) {
      mDupDatas.clear();
    }
    mDatas = datas;
    mDupDatas.addAll(mDatas);
  }
  
  public void setAdapter(BaseAdapter adapter) {
    if (null == adapter) {
      return;
    }
    mAdapter = adapter;
  }

获取到适配器及数据源,并且做了相关数据备份工作.

接着要提供一个回调接口来得到筛选后的数据.


  
  interface SearchDatas<T> {
    
    List<T> filterDatas(List<T> datas, List<T> filterdatas, String inputstr);
  }
  
  private SearchDatas<T> mListener;
  
  public void setSearchDataListener(SearchDatas<T> listener) {
    mListener = listener;
  }

同样需要对外提供一个方法,以便使用者获取到筛选后的数据去做相关操作.


  
  public List<T> getFilterDatas() {
    return (null != mDupFilterDatas && mDupFilterDatas.size() > 0) ? mDupFilterDatas : mDupDatas;
  }

得到数据之后,就是在输入框和清除按钮的监听方法中去做相关处理就可以了,完整代码如下:


package com.example.junweiliu.commonlysearchview;
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Bitmap;
import android.graphics.canvas;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.text.Editable;
import android.text.TextWatcher;
import android.util.AttributeSet;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ListView;
import java.util.ArrayList;
import java.util.List;

public class CommolySearchView<T> extends LinearLayout {
  
  private Context mContext;
  
  private EditText mEditText;
  
  private ImageView mClearImg;
  
  private ImageView mSearchBarImg;
  
  private BaseAdapter mAdapter;
  
  private List<T> mDatas = new ArrayList<T>();
  
  private List<T> mDupDatas = new ArrayList<T>();
  
  private List<T> mFilterDatas = new ArrayList<T>();
  
  private List<T> mDupFilterDatas = new ArrayList<T>();
  
  private Bitmap mSearchIcon;
  
  private int mSearchIconMarginLeft;
  
  private int mSearchIconMarginRight;
  
  private Bitmap mClearIcon;
  
  private int mClearIconMarginLeft;
  
  private int mClearIconMarginRight;
  
  private int mSearchTextSize;
  
  private int mSearchTextColor;
  
  interface SearchDatas<T> {
    
    List<T> filterDatas(List<T> datas, List<T> filterdatas, String inputstr);
  }
  
  private SearchDatas<T> mListener;
  
  public void setSearchDataListener(SearchDatas<T> listener) {
    mListener = listener;
  }
  public CommolySearchView(Context context) {
    this(context, null);
  }
  public CommolySearchView(Context context, AttributeSet attrs) {
    this(context, attrs, 0);
  }
  public CommolySearchView(Context context, AttributeSet attrs, int defStyleAttr) {
    super(context, attrs, defStyleAttr);
    mContext = context;
    // 自定义属性
    TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.CommolySearchView);
    Drawable searchD = ta.getDrawable(R.styleable.CommolySearchView_SearchBarIconSrc);
    mSearchIcon = drawableToBitamp(searchD);
    mSearchIconMarginLeft = px2dip(context, ta.getDimensionPixelOffset(R.styleable.CommolySearchView_SearchBarIconMarginLeft, 0));
    mSearchIconMarginRight = px2dip(context, ta.getDimensionPixelOffset(R.styleable.CommolySearchView_SearchBarIconMarginRight, 0));
    Drawable clearD = ta.getDrawable(R.styleable.CommolySearchView_ClearIconSrc);
    mClearIcon = drawableToBitamp(clearD);
    mClearIconMarginLeft = px2dip(context, ta.getDimensionPixelOffset(R.styleable.CommolySearchView_ClearIconMarginLeft, 0));
    mClearIconMarginRight = px2dip(context, ta.getDimensionPixelOffset(R.styleable.CommolySearchView_ClearIconMarginRight, 0));
    mSearchTextSize = px2sp(context, ta.getDimensionPixelOffset(R.styleable.CommolySearchView_SearchTextSize, 0));
    mSearchTextColor = ta.getColor(R.styleable.CommolySearchView_SearchTextColor, 0);
    ta.recycle();
    // 绑定布局文件
    LayoutInflater.from(context).inflate(R.layout.searchview_layout, this);
    initView();
  }
  
  private void initView() {
    mEditText = (EditText) findViewById(R.id.et_search);
    mClearImg = (ImageView) findViewById(R.id.iv_search_clear);
    mSearchBarImg = (ImageView) findViewById(R.id.iv_search_icon);
    // 处理自定义属性
    if (0 != mSearchIconMarginLeft || 0 != mSearchIconMarginRight) {
      mSearchBarImg.setPadding(mSearchIconMarginLeft, 0, mSearchIconMarginRight, 0);
    }
    if (0 != mClearIconMarginLeft || 0 != mClearIconMarginRight) {
      mClearImg.setPadding(mClearIconMarginLeft, 0, mClearIconMarginRight, 0);
    }
    if (null != mSearchIcon) {
      mSearchBarImg.setImageBitmap(mSearchIcon);
    }
    if (null != mClearIcon) {
      mClearImg.setImageBitmap(mClearIcon);
    }
    if (0 != mSearchTextSize) {
      mEditText.setTextSize(mSearchTextSize);
    }
    if (0 != mSearchTextColor) {
      mEditText.setTextColor(mSearchTextColor);
    }
    // 清空按钮处理事件
    mClearImg.setOnClickListener(new OnClickListener() {
      @Override
      public void onClick(View view) {
        mEditText.setText("");
        mClearImg.setVisibility(View.GONE);
        if (null != mDatas) {
          mDatas.clear();
        }
        mDatas.addAll(mDupDatas);
        mAdapter.notifyDataSetChanged();
        reSetDatas();
      }
    });
    // 搜索栏处理事件
    mEditText.addTextChangedListener(new TextWatcher() {
      @Override
      public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
      }
      @Override
      public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
        // 获取筛选后的数据
        mFilterDatas = mListener.filterDatas(mDupDatas, mFilterDatas, charSequence.toString());
        if (charSequence.toString().length() > 0 && !charSequence.toString().equals("")) {
          mClearImg.setVisibility(View.VISIBLE);
        } else {
          mClearImg.setVisibility(View.GONE);
        }
        if (null != mDatas) {
          mDatas.clear();
        }
        mDatas.addAll(mFilterDatas);
        mAdapter.notifyDataSetChanged();
        reSetDatas();
      }
      @Override
      public void afterTextChanged(Editable editable) {
      }
    });
  }
  
  public List<T> getFilterDatas() {
    return (null != mDupFilterDatas && mDupFilterDatas.size() > 0) ? mDupFilterDatas : mDupDatas;
  }
  
  private void reSetDatas() {
    if (null != mFilterDatas) {
      if (null != mDupFilterDatas) {
        mDupFilterDatas.clear();
        mDupFilterDatas.addAll(mFilterDatas);
      }
      mFilterDatas.clear();
    }
  }
  
  public void setDatas(List<T> datas) {
    if (null == datas) {
      return;
    }
    if (null != mDatas) {
      mDatas.clear();
    }
    if (null != mDupDatas) {
      mDupDatas.clear();
    }
    mDatas = datas;
    mDupDatas.addAll(mDatas);
  }
  
  public void setAdapter(BaseAdapter adapter) {
    if (null == adapter) {
      return;
    }
    mAdapter = adapter;
  }
  
  private Bitmap drawableToBitamp(Drawable drawable) {
    if (null == drawable) {
      return null;
    }
    if (drawable instanceof BitmapDrawable) {
      BitmapDrawable bd = (BitmapDrawable) drawable;
      return bd.getBitmap();
    }
    int w = drawable.getIntrinsicWidth();
    int h = drawable.getIntrinsicHeight();
    Bitmap bitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
    Canvas canvas = new Canvas(bitmap);
    drawable.setBounds(0, 0, w, h);
    drawable.draw(canvas);
    return bitmap;
  }
  
  public int px2dip(Context context, float pxValue) {
    final float scale = context.getResources().getDisplayMetrics().density;
    return (int) (pxValue / scale + 0.5f);
  }
  
  public static int px2sp(Context context, float pxValue) {
    final float fontScale = context.getResources().getDisplayMetrics().scaledDensity;
    return (int) (pxValue / fontScale + 0.5f);
  }
}

三、完整代码及使用

换一个复杂点的listview来使用一下.很简单,就是普通的Listview绑定数据,我们结合CommolySearchView来使用一下.

实体Bean
SanGuoBean:


package com.example.junweiliu.commonlysearchview.bean;

public class SanGuoBean {
  
  private String sgName;
  
  private String sgDescribe;
  
  private int sgHeadBp;
  
  private String sgPetName;
  public SanGuoBean() {
  }
  public SanGuoBean(String sgName, String sgDescribe, int sgHeadBp, String sgPetName) {
    this.sgName = sgName;
    this.sgDescribe = sgDescribe;
    this.sgHeadBp = sgHeadBp;
    this.sgPetName = sgPetName;
  }
  public String getSgName() {
    return sgName;
  }
  public void setSgName(String sgName) {
    this.sgName = sgName;
  }
  public String getSgDescribe() {
    return sgDescribe;
  }
  public void setSgDescribe(String sgDescribe) {
    this.sgDescribe = sgDescribe;
  }
  public int getSgHeadBp() {
    return sgHeadBp;
  }
  public void setSgHeadBp(int sgHeadBp) {
    this.sgHeadBp = sgHeadBp;
  }
  public String getSgPetName() {
    return sgPetName;
  }
  public void setSgPetName(String sgPetName) {
    this.sgPetName = sgPetName;
  }
}

适配器每项布局文件sg_item:


<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
       android:layout_width="match_parent"
       android:layout_height="match_parent"
       android:gravity="center_vertical"
       android:orientation="horizontal"
       android:padding="6dp"
  >
  <ImageView
    android:id="@+id/iv_sghead"
    android:layout_width="80dp"
    android:layout_height="80dp"
    android:scaleType="fitXY"
    android:src="@mipmap/ic_launcher"
    />
  <LinearLayout
    android:layout_width="0dp"
    android:layout_height="match_parent"
    android:layout_marginLeft="8dp"
    android:layout_weight="1"
    android:orientation="vertical"
    >
    <TextView
      android:id="@+id/tv_sgname"
      android:layout_width="match_parent"
      android:layout_height="wrap_content"
      android:textSize="16sp"
      />
    <TextView
      android:id="@+id/tv_sgpetname"
      android:layout_width="match_parent"
      android:layout_height="wrap_content"
      android:layout_marginTop="2dp"
      android:textSize="12sp"
      />
    <TextView
      android:id="@+id/tv_sgdes"
      android:layout_width="match_parent"
      android:layout_height="wrap_content"
      android:layout_marginTop="2dp"
      android:textSize="12sp"
      />
  </LinearLayout>
</LinearLayout>

适配器SGAdapter:


package com.example.junweiliu.commonlysearchview.adapter;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;
import com.example.junweiliu.commonlysearchview.R;
import com.example.junweiliu.commonlysearchview.bean.SanGuoBean;
import com.example.junweiliu.commonlysearchview.bean.SearchBean;
import java.util.List;

public class SGAdapter extends BaseAdapter {
  
  private Context mContext;
  
  private List<SanGuoBean> mDatas;
  
  public SGAdapter(Context context, List<SanGuoBean> datas) {
    mContext = context;
    mDatas = datas;
  }
  @Override
  public int getCount() {
    return mDatas.size();
  }
  @Override
  public Object getItem(int i) {
    return mDatas.get(i);
  }
  @Override
  public long getItemId(int i) {
    return i;
  }
  @Override
  public View getView(int position, View view, ViewGroup viewGroup) {
    ViewHolder vh = null;
    if (null == view) {
      vh = new ViewHolder();
      LayoutInflater mInflater = LayoutInflater.from(mContext);
      view = mInflater.inflate(R.layout.sg_item, null);
      vh.mNameTv = (TextView) view.findViewById(R.id.tv_sgname);
      vh.mPetNmaeTv = (TextView) view.findViewById(R.id.tv_sgpetname);
      vh.mDesTv = (TextView) view.findViewById(R.id.tv_sgdes);
      vh.mHeadImg = (ImageView) view.findViewById(R.id.iv_sghead);
      view.setTag(vh);
    } else {
      vh = (ViewHolder) view.getTag();
    }
    SanGuoBean bean = (SanGuoBean) getItem(position);
    if (null != bean) {
      vh.mNameTv.setText(bean.getSgName());
      vh.mDesTv.setText(bean.getSgDescribe());
      vh.mPetNmaeTv.setText(bean.getSgPetName());
      vh.mHeadImg.setImageResource(bean.getSgHeadBp());
    }
    return view;
  }
  
  class ViewHolder {
    
    TextView mNameTv;
    
    TextView mDesTv;
    
    TextView mPetNmaeTv;
    
    ImageView mHeadImg;
  }
}

MainActivity布局文件activity_main:


<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
  xmlns:android="http://schemas.android.com/apk/res/android"
  xmlns:search="http://schemas.android.com/apk/res-auto"
  xmlns:tools="http://schemas.android.com/tools"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:orientation="vertical"
  tools:context="com.example.junweiliu.commonlysearchview.MainActivity">
  <com.example.junweiliu.commonlysearchview.CommolySearchView
    android:id="@+id/csv_show"
    android:layout_width="match_parent"
    android:layout_height="40dp"
    android:layout_margin="8dip"
    android:background="@drawable/login_et_bg"
    search:SearchTextColor="#ff0000"
    search:SearchTextSize="14sp"
    >
  </com.example.junweiliu.commonlysearchview.CommolySearchView>
  <ListView
    android:id="@+id/lv_show"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    >
  </ListView>
</LinearLayout>

MainActivity:


package com.example.junweiliu.commonlysearchview;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ListView;
import android.widget.Toast;
import com.example.junweiliu.commonlysearchview.adapter.SGAdapter;
import com.example.junweiliu.commonlysearchview.adapter.SearchAdapter;
import com.example.junweiliu.commonlysearchview.bean.SanGuoBean;
import com.example.junweiliu.commonlysearchview.bean.SearchBean;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends Activity {
  
  private static final String TAG = "MainActivity";
  
  private ListView mListView;
  
  private SearchAdapter adapter;
  
  private CommolySearchView<SanGuoBean> mSGCommolySearchView;
  
  private List<SanGuoBean> mSGDatas;
  
  private SGAdapter sgAdapter;
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    initDataI();
    initViewI();
  }
  
  private void initDataI() {
    mSGDatas = new ArrayList<SanGuoBean>();
    SanGuoBean sgbean1 = new SanGuoBean();
    sgbean1.setSgName("刘备");
    sgbean1.setSgPetName("玄德");
    sgbean1.setSgHeadBp(R.drawable.lb);
    sgbean1.setSgDescribe("刘备(161年-223年6月10日),字玄德,东汉末年幽州涿郡涿县(今河北省涿州市)人");
    SanGuoBean sgbean2 = new SanGuoBean();
    sgbean2.setSgName("关羽");
    sgbean2.setSgPetName("云长");
    sgbean2.setSgHeadBp(R.drawable.gy);
    sgbean2.setSgDescribe("关羽(?-220年),本字长生,后改字云长,河东郡解良(今山西运城)人");
    SanGuoBean sgbean3 = new SanGuoBean();
    sgbean3.setSgName("张飞");
    sgbean3.setSgPetName("翼德");
    sgbean3.setSgHeadBp(R.drawable.zf);
    sgbean3.setSgDescribe("张飞(?-221年),字益德[1] ,幽州涿郡(今河北省保定市涿州市)人氏");
    SanGuoBean sgbean4 = new SanGuoBean();
    sgbean4.setSgName("赵云");
    sgbean4.setSgPetName("子龙");
    sgbean4.setSgHeadBp(R.drawable.zy);
    sgbean4.setSgDescribe("赵云(?-229年),字子龙,常山真定(今河北省正定)人");
    SanGuoBean sgbean5 = new SanGuoBean();
    sgbean5.setSgName("马超");
    sgbean5.setSgPetName("孟起");
    sgbean5.setSgHeadBp(R.drawable.mc);
    sgbean5.setSgDescribe("马超(176年-222年),字孟起,司隶部扶风郡茂陵(今陕西兴平)人");
    SanGuoBean sgbean6 = new SanGuoBean();
    sgbean6.setSgName("黄忠");
    sgbean6.setSgPetName("汉升");
    sgbean6.setSgHeadBp(R.drawable.hz);
    sgbean6.setSgDescribe("黄忠(?-220年),字汉升(一作“汉叔”[1] ),南阳(今河南南阳)人");
    SanGuoBean sgbean7 = new SanGuoBean();
    sgbean7.setSgName("张辽");
    sgbean7.setSgPetName("文远");
    sgbean7.setSgHeadBp(R.drawable.zl);
    sgbean7.setSgDescribe("张辽(169年-222年),字文远,雁门马邑(今山西朔州)人");
    mSGDatas.add(sgbean1);
    mSGDatas.add(sgbean2);
    mSGDatas.add(sgbean3);
    mSGDatas.add(sgbean4);
    mSGDatas.add(sgbean5);
    mSGDatas.add(sgbean6);
    mSGDatas.add(sgbean7);
  }
  
  private void initViewI() {
    mSGCommolySearchView = (CommolySearchView) findViewById(R.id.csv_show);
    mListView = (ListView) findViewById(R.id.lv_show);
    sgAdapter = new SGAdapter(this, mSGDatas);
    mListView.setAdapter(sgAdapter);
    // 设置数据源
    mSGCommolySearchView.setDatas(mSGDatas);
    // 设置适配器
    mSGCommolySearchView.setAdapter(sgAdapter);
    // 设置筛选数据
    mSGCommolySearchView.setSearchDataListener(new CommolySearchView.SearchDatas<SanGuoBean>() {
      @Override
      public List<SanGuoBean> filterDatas(List<SanGuoBean> datas, List<SanGuoBean> filterdatas, String inputstr) {
        for (int i = 0; i < datas.size(); i++) {
          // 筛选条件
          if ((datas.get(i).getSgDescribe()).contains(inputstr) || datas.get(i).getSgName().contains(inputstr) || datas.get(i).getSgPetName().contains(inputstr)) {
            filterdatas.add(datas.get(i));
          }
        }
        return filterdatas;
      }
    });
    mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
      @Override
      public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
        Toast.makeText(MainActivity.this, mSGCommolySearchView.getFilterDatas().get(i).getSgName() + "字" + mSGCommolySearchView.getFilterDatas().get(i).getSgPetName() + "\n" + mSGCommolySearchView.getFilterDatas().get(i).getSgDescribe(), Toast.LENGTH_SHORT).show();
      }
    });
  }
}

效果图如下:

最终效果图

您可能感兴趣的文章:Android SearchView搜索框组件的使用方法Android搜索框组件SearchView的基本使用方法Android搜索框SearchView属性和用法详解Android自定义View实现搜索框(SearchView)功能Android顶部(toolbar)搜索框实现的实例详解Android搜索框(SearchView)的功能和用法详解Android 根据EditText搜索框ListView动态显示数据Android EditText搜索框实现图标居中android顶部(toolbar)搜索框实现代码Android仿京东搜索框渐变效果


--结束END--

本文标题: Android搜索框通用版

本文链接: https://www.lsjlt.com/news/24797.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Android搜索框通用版
    之前项目总会遇到很多搜索框类的功能,虽然不是很复杂,不过每次都要去自己处理数据,并且去处理搜索框的变化,写起来也比较麻烦,今天来做一个比较简单的通用搜索栏。 先看下效果图: ...
    99+
    2022-06-06
    android搜索框 通用 Android
  • Android如何实现搜索框
    这篇文章主要介绍了Android如何实现搜索框,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。具体内容如下展示效果代码区SouActivitypublic class...
    99+
    2023-05-30
    android
  • Android实现实时搜索框功能
    AutoCompleteTextView,自动完成文本框。用于实现允许用户输入一定字符后,显示一个下拉菜单,供用户从中选择,当用户选择某个选项后,按用户选择自动填写该文本框。该组件继承EditText,所以它支持EditText组件提供的属...
    99+
    2023-05-30
    android 搜索框 roi
  • Android顶部搜索框怎么实现
    要实现Android顶部搜索框,可以使用Toolbar和SearchView组件。 首先,在你的布局文件中添加一个Toolbar组件...
    99+
    2023-10-26
    android
  • Android的搜索框架实例详解
    基础知识 Android的搜索框架将代您管理的搜索对话框,您不需要自己去开发一个搜索框,不需要担心要把搜索框放什么位置,也不需要担心搜索框影响您当前的界面。所有的这些工作都由S...
    99+
    2022-06-06
    框架 Android
  • Android如何实现顶部搜索框
    这篇文章给大家分享的是有关Android如何实现顶部搜索框的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。本文介绍两种SearchView的使用情况,一种是输入框和搜索结果不在一个activity中,另一种是在一个...
    99+
    2023-05-30
    android
  • Android SearchView搜索框组件的使用方法
    SearchView是搜索框组件,它可以让用户在文本框里输入文字,通过监听器取得用户的输入,当用户点击搜索时,监听器执行实际的搜索。 本文就为大家分享了SearchView搜索...
    99+
    2022-06-06
    方法 Android
  • Android EditText搜索框实现图标居中
    类似这样EditText 搜索框,hiht 提示有一个icon并且text内容。重写EditText :package mobi.truekey.weapp2.widget;import android.content.Context;im...
    99+
    2023-05-31
    android 搜索框 edittext
  • android搜索框上下滑动变色效果
    搜索框上下滑动变透明度是现在APP中很常见的效果,先看看效果: 首先来看下布局骨架: <RelativeLayout xmlns:android="http://...
    99+
    2022-06-06
    android搜索框 Android
  • Android搜索框组件SearchView的基本使用方法
    SearchView是android系统中内置的一个搜索框组件,可以很方便在添加在用户界面之上,但是也带来了一些问题,那就是searchview的UI是固定的,定制起来会很麻烦...
    99+
    2022-06-06
    方法 android搜索框 Android
  • win101909专业版搜索框失效如何解决
    这篇文章主要介绍了win101909专业版搜索框失效如何解决的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇win101909专业版搜索框失效如何解决文章都会有所收获,下面我们一起来看看吧。win101909专业...
    99+
    2023-07-01
  • Android使用ContentResolver搜索手机通讯录的方法
    本文实例讲述了Android使用ContentResolver搜索手机通讯录的方法。分享给大家供大家参考,具体如下: 在这个程序中使用ContentResolver来访问通讯录...
    99+
    2022-06-06
    方法 手机 Android
  • 简单实现Android端搜索框示例详解
    目录正文一、效果展示二、快速使用及属性介绍快速使用具体代码主要方法介绍1、搜索框监听2、搜索列表点击事件3、改变最近(历史)搜索item背景4、动态设置热门搜索热度属性介绍Searc...
    99+
    2022-11-13
    Android端搜索框 Android 搜索框
  • Android如何实现仿简书搜索框效果
    这篇文章给大家分享的是有关Android如何实现仿简书搜索框效果的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。直接上图:Activity 布局:<xml version="1.0&quo...
    99+
    2023-05-30
    android
  • android如何实现仿微信通讯录搜索
    这篇文章将为大家详细讲解有关android如何实现仿微信通讯录搜索,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一:先看效果图字母索引搜索匹配二:功能分析1:汉字转拼音通讯录汉字转拼音(首个字符当考虑姓氏...
    99+
    2023-05-30
    android
  • Android中如何实现清空搜索框的文字
    需求:项目中的有关搜索的地方,加上清空文字的功能,目的是为了增加用户体验,使用户删除文本更加快捷 解决过程:开始的时候感觉这个东西不太好实现,主要就是布局的问题,可能是开始顾虑...
    99+
    2022-06-06
    Android
  • Android 根据EditText搜索框ListView动态显示数据
    根据EditText搜索框ListView动态显示数据是根据需求来的,觉得这之中涉及的东西可能比较的有意思,所以动手来写一写,希望对大家有点帮助。 首先,我们来分析下整个过程:...
    99+
    2022-06-06
    edittext 数据 listview Android
  • Win10如何禁用Cortana把Cortana搜索框改成搜索图标
      Win10 Build 9926终于带来了微软小娜Cortana,遗憾的是目前只支持英文语音,而且这个Cortana在任务栏上以搜索框形式出现,占用了“寸土寸金”的任务栏较大空间。有用户想暂时...
    99+
    2023-06-11
    Win10 Cortana 搜索框 图标 搜索
  • win101909版本系统任务栏搜索框用不了如何解决
    这篇文章主要介绍了win101909版本系统任务栏搜索框用不了如何解决的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇win101909版本系统任务栏搜索框用不了如何解决文章都会有所收获,下面我们一起来看看吧。按...
    99+
    2023-07-01
  • Android ActionBar搜索功能用法详解
    本文实例讲述了Android ActionBar搜索功能用法。分享给大家供大家参考,具体如下: 使用ActionBar SearchView时的注意点: 首先要吐槽一下Andr...
    99+
    2022-06-06
    actionbar Android
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作