自定义搜索功能Android实现

先看看效果图:

源码下载:自定义搜索功能

代码:

SearchActivity.java

package com.bzu.gxs.search.activity; import android.app.Activity; import android.os.Bundle; import android.support.v7.widget.Toolbar; import android.view.View; import android.widget.AdapterView; import android.widget.ArrayAdapter; import android.widget.ListView; import android.widget.Toast; import com.bzu.gxs.search.R; import com.bzu.gxs.search.adapter.SearchAdapter; import com.bzu.gxs.search.bean.SearchBean; import com.bzu.gxs.search.widget.SearchView; import java.util.ArrayList; import java.util.List; /** * 搜索 * Created by Gxs on 2016/5/6. */ public class SearchActivity extends Activity implements SearchView.SearchViewListener{ /** * 搜索结果列表view */ private ListView lvResults; /** * 搜索view */ private SearchView searchView; /** * 热搜框列表adapter */ private ArrayAdapter<String> hintAdapter; /** * 自动补全列表adapter */ private ArrayAdapter<String> autoCompleteAdapter; /** * 搜索结果列表adapter */ private SearchAdapter resultAdapter; private List<SearchBean> dbData; /** * 热搜版数据 */ private List<String> hintData; /** * 搜索过程中自动补全数据 */ private List<String> autoCompleteData; /** * 搜索结果的数据 */ private List<SearchBean> resultData; /** * 默认提示框显示项的个数 */ private static int DEFAULT_HINT_SIZE = 4; /** * 提示框显示项的个数 */ private static int hintSize = DEFAULT_HINT_SIZE; /** * 设置提示框显示项的个数 * * @param hintSize 提示框显示个数 */ public static void setHintSize(int hintSize) { SearchActivity.hintSize = hintSize; } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initData(); initViews(); } /** * 初始化视图 */ private void initViews() { lvResults = (ListView) findViewById(R.id.main_lv_search_results); searchView = (SearchView) findViewById(R.id.main_search_layout); //设置监听 searchView.setSearchViewListener(this); //设置adapter searchView.setTipsHintAdapter(hintAdapter); searchView.setAutoCompleteAdapter(autoCompleteAdapter); lvResults.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> adapterView, View view, int position, long l) { Toast.makeText(SearchActivity.this, position + "", Toast.LENGTH_SHORT).show(); } }); } /** * 初始化数据 */ private void initData() { //从数据库获取数据 getDbData(); //初始化热搜版数据 getHintData(); //初始化自动补全数据 getAutoCompleteData(null); //初始化搜索结果数据 getResultData(null); } /** * 获取db 数据 */ private void getDbData() { int size = 100; dbData = new ArrayList<>(size); for (int i = 0; i < size; i++) { dbData.add(new SearchBean(R.mipmap.ic_launcher, "Andrion Stuidy 起风了," + (i + 1), "唯有努力才能生存!", i * 20 + 2 + "")); } } /** * 获取热搜版data 和adapter */ private void getHintData() { hintData = new ArrayList<>(hintSize); for (int i = 1; i <= hintSize; i++) { hintData.add("Andrion Stuidy 起风了"); } hintAdapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, hintData); } /** * 获取自动补全data 和adapter */ private void getAutoCompleteData(String text) { if (autoCompleteData == null) { //初始化 autoCompleteData = new ArrayList<>(hintSize); } else { // 根据text 获取auto data autoCompleteData.clear(); for (int i = 0, count = 0; i < dbData.size() && count < hintSize; i++) { if (dbData.get(i).getTitle().contains(text.trim())) { autoCompleteData.add(dbData.get(i).getTitle()); count++; } } } if (autoCompleteAdapter == null) { autoCompleteAdapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, autoCompleteData); } else { autoCompleteAdapter.notifyDataSetChanged(); } } /** * 获取搜索结果data和adapter */ private void getResultData(String text) { if (resultData == null) { // 初始化 resultData = new ArrayList<>(); } else { resultData.clear(); for (int i = 0; i < dbData.size(); i++) { if (dbData.get(i).getTitle().contains(text.trim())) { resultData.add(dbData.get(i)); } } } if (resultAdapter == null) { resultAdapter = new SearchAdapter(this, resultData, R.layout.item_search); } else { resultAdapter.notifyDataSetChanged(); } } //当搜索框 文本改变时 触发的回调 ,更新自动补全数据 @Override public void onRefreshAutoComplete(String text) { //更新数据 getAutoCompleteData(text); } //点击搜索键时edit text触发的回调 @Override public void onSearch(String text) { //更新result数据 getResultData(text); lvResults.setVisibility(View.VISIBLE); //第一次获取结果 还未配置适配器 if (lvResults.getAdapter() == null) { //获取搜索数据 设置适配器 lvResults.setAdapter(resultAdapter); } else { //更新搜索数据 resultAdapter.notifyDataSetChanged(); } } }

SearchBean.java

package com.bzu.gxs.search.bean; /** * Created by GXS on 2016/5/9. */ public class SearchBean { private int iconId; private String title; private String content; private String comments; public SearchBean(int iconId,String title,String content,String comments){ this.iconId=iconId; this.title=title; this.content=content; this.comments=comments; } public int getIconId() { return iconId; } public void setIconId(int iconId) { this.iconId = iconId; } public void setTitle(String title) { this.title = title; } public String getTitle() { return title; } public String getContent() { return content; } public void setContent(String content) { this.content = content; } public String getComments() { return comments; } public void setComments(String comments) { this.comments = comments; } }

SearchAdapter.java

package com.bzu.gxs.search.adapter; import android.content.Context; import com.bzu.gxs.search.bean.SearchBean; import java.util.List; import com.bzu.gxs.search.R; /** * Created by GXS on 2016/5/9. */ public class SearchAdapter extends CommonAdapter<SearchBean> { public SearchAdapter(Context context, List<SearchBean> data, int layoutId) { super(context, data, layoutId); } @Override public void convert(ViewHolder holder, int position) { holder.setImageResource(R.id.item_search_iv_icon,mData.get(position).getIconId()) .setText(R.id.item_search_tv_title,mData.get(position).getTitle()) .setText(R.id.item_search_tv_content,mData.get(position).getContent()) .setText(R.id.item_search_tv_comments,mData.get(position).getComments()); } }

CommonAdapter.java

package com.bzu.gxs.search.adapter; import android.content.Context; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import java.util.List; /** * Created by GXS on 2016/5/9. */ public abstract class CommonAdapter<T> extends BaseAdapter { protected Context mContext; protected List<T> mData; protected int mLayoutId; public CommonAdapter(Context context,List<T> data,int layoutId){ mContext = context; mData = data; mLayoutId = layoutId; } @Override public int getCount() { return mData.size(); } @Override public Object getItem(int position) { return mData.get(position); } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { ViewHolder holder = ViewHolder.getHolder(mContext,convertView,mLayoutId,parent,position); convert(holder,position); return holder.getConvertView(); } /** * get holder convert */ public abstract void convert(ViewHolder holder,int position); }

ViewHolder.java

package com.bzu.gxs.search.adapter; import android.content.Context; import android.graphics.Bitmap; import android.util.SparseArray; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; import android.widget.TextView; /** * Created by GXS on 2016/5/9. */ public class ViewHolder { private SparseArray<View> mViews; private Context mContext; private View mConvertView; private int mPosition; /** * 初始化 holder */ public ViewHolder(Context context, int layoutId, ViewGroup parent, int position) { mConvertView = LayoutInflater.from(context).inflate(layoutId,parent,false); mViews = new SparseArray<>(); mPosition = position; mConvertView.setTag(this); } /** * 获取 viewHolder */ public static ViewHolder getHolder(Context context, View convertView, int layoutId, ViewGroup parent, int position) { if(convertView == null){ return new ViewHolder(context,layoutId,parent,position); }else{ ViewHolder holder = (ViewHolder)convertView.getTag(); holder.mPosition = position; return holder; } } public View getConvertView(){ return mConvertView; } /** * 获取 view */ public <T extends View> T getView(int viewId){ View view = mViews.get(viewId); if(view == null){ view = mConvertView.findViewById(viewId); mViews.put(viewId,view); } return (T)view; } /** * 设置 text */ public ViewHolder setText(int viewId, String text){ TextView tv = getView(viewId); tv.setText(text); return this; } /** * 设置图片资源 */ public ViewHolder setImageResource(int viewId,int resId){ ImageView iv = getView(viewId); iv.setImageResource(resId); return this; } /** * 设置图片 bitmap */ public ViewHolder setImageBitmap(int viewId,Bitmap bitmap){ ImageView iv = getView(viewId); iv.setImageBitmap(bitmap); return this; } }

SearchView.java

package com.bzu.gxs.search.widget; import android.app.Activity; import android.content.Context; import android.text.Editable; import android.text.TextWatcher; import android.util.AttributeSet; import android.view.KeyEvent; import android.view.LayoutInflater; import android.view.View; import android.view.inputmethod.EditorInfo; import android.view.inputmethod.InputMethodManager; import android.widget.AdapterView; import android.widget.ArrayAdapter; import android.widget.Button; import android.widget.EditText; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.ListView; import android.widget.TextView; import com.bzu.gxs.search.R; public class SearchView extends LinearLayout implements View.OnClickListener { /** * 输入框 */ private EditText etInput; /** * 删除键 */ private ImageView ivDelete; /** * 返回按钮 */ private Button btnBack; /** * 上下文对象 */ private Context mContext; /** * 弹出列表 */ private ListView lvTips; /** * 提示adapter (推荐adapter) */ private ArrayAdapter<String> mHintAdapter; /** * 自动补全adapter 只显示名字 */ private ArrayAdapter<String> mAutoCompleteAdapter; /** * 搜索回调接口 */ private SearchViewListener mListener; /** * 设置搜索回调接口 * * @param listener 监听者 */ public void setSearchViewListener(SearchViewListener listener) { mListener = listener; } public SearchView(Context context, AttributeSet attrs) { super(context, attrs); mContext = context; LayoutInflater.from(context).inflate(R.layout.activity_search, this); initViews(); } private void initViews() { etInput = (EditText) findViewById(R.id.search_et_input); ivDelete = (ImageView) findViewById(R.id.search_iv_delete); btnBack = (Button) findViewById(R.id.search_btn_back); lvTips = (ListView) findViewById(R.id.search_lv_tips); lvTips.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) { //set edit text String text = lvTips.getAdapter().getItem(i).toString(); etInput.setText(text); etInput.setSelection(text.length()); //hint list view gone and result list view show lvTips.setVisibility(View.GONE); notifyStartSearching(text); } }); ivDelete.setOnClickListener(this); btnBack.setOnClickListener(this); etInput.addTextChangedListener(new EditChangedListener()); etInput.setOnClickListener(this); etInput.setOnEditorActionListener(new TextView.OnEditorActionListener() { @Override public boolean onEditorAction(TextView textView, int actionId, KeyEvent keyEvent) { if (actionId == EditorInfo.IME_ACTION_SEARCH) { lvTips.setVisibility(GONE); notifyStartSearching(etInput.getText().toString()); } return true; } }); } /** * 通知监听者 进行搜索操作 * @param text */ private void notifyStartSearching(String text){ if (mListener != null) { mListener.onSearch(etInput.getText().toString()); } //隐藏软键盘 InputMethodManager imm = (InputMethodManager) mContext.getSystemService(Context.INPUT_METHOD_SERVICE); imm.toggleSoftInput(0, InputMethodManager.HIDE_NOT_ALWAYS); } /** * 设置热搜版提示 adapter */ public void setTipsHintAdapter(ArrayAdapter<String> adapter) { this.mHintAdapter = adapter; if (lvTips.getAdapter() == null) { lvTips.setAdapter(mHintAdapter); } } /** * 设置自动补全adapter */ public void setAutoCompleteAdapter(ArrayAdapter<String> adapter) { this.mAutoCompleteAdapter = adapter; } private class EditChangedListener implements TextWatcher { @Override public void beforeTextChanged(CharSequence charSequence, int i, int i2, int i3) { } @Override public void onTextChanged(CharSequence charSequence, int i, int i2, int i3) { if (!"".equals(charSequence.toString())) { ivDelete.setVisibility(VISIBLE); lvTips.setVisibility(VISIBLE); if (mAutoCompleteAdapter != null && lvTips.getAdapter() != mAutoCompleteAdapter) { lvTips.setAdapter(mAutoCompleteAdapter); } //更新autoComplete数据 if (mListener != null) { mListener.onRefreshAutoComplete(charSequence + ""); } } else { ivDelete.setVisibility(GONE); if (mHintAdapter != null) { lvTips.setAdapter(mHintAdapter); } lvTips.setVisibility(GONE); } } @Override public void afterTextChanged(Editable editable) { } } @Override public void onClick(View view) { switch (view.getId()) { case R.id.search_et_input: lvTips.setVisibility(VISIBLE); break; case R.id.search_iv_delete: etInput.setText(""); ivDelete.setVisibility(GONE); break; case R.id.search_btn_back: ((Activity) mContext).finish(); break; } } /** * search view回调方法 */ public interface SearchViewListener { /** * 更新自动补全内容 * * @param text 传入补全后的文本 */ void onRefreshAutoComplete(String text); /** * 开始搜索 * * @param text 传入输入框的文本 */ void onSearch(String text); } }

布局文件:

activity_main.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:background="#ffffff" tools:context=".activity.SearchActivity" android:orientation="vertical"> <com.bzu.gxs.search.widget.SearchView android:id="@+id/main_search_layout" android:layout_width="match_parent" android:layout_height="wrap_content" android:fitsSystemWindows="true"> </com.bzu.gxs.search.widget.SearchView> <ListView android:id="@+id/main_lv_search_results" android:layout_width="match_parent" android:layout_height="wrap_content"> </ListView> </LinearLayout>

activity_search.xml

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:background="#ffffff" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical"> <LinearLayout android:background="#E5E5E5" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal"> <FrameLayout android:layout_weight="1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_vertical"> <EditText android:id="@+id/search_et_input" android:layout_gravity="center_vertical" android:layout_margin="10dp" android:drawableLeft="@drawable/ic_search" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@drawable/search_edittext_shape" android:textSize="16sp" android:imeOptions="actionSearch" android:inputType="text" android:hint="请输入搜索的内容"/> <ImageView android:visibility="gone" android:layout_marginRight="20dp" android:src="@drawable/ic_delete" android:id="@+id/search_iv_delete" android:layout_gravity="right|center_vertical" android:layout_width="wrap_content" android:layout_height="wrap_content"/> </FrameLayout> <Button android:id="@+id/search_btn_back" android:layout_marginRight="10dp" android:paddingLeft="5dp" android:paddingRight="10dp" android:layout_gravity="center_vertical" android:text="取消" android:textColor="#EA5421" android:textSize="15sp" android:background="@null" android:layout_height="wrap_content" android:layout_width="50dp" /> </LinearLayout> <ListView android:visibility="gone" android:id="@+id/search_lv_tips" android:background="#ffffff" android:layout_marginBottom="10dp" android:layout_width="match_parent" android:layout_height="600dp"> </ListView> </LinearLayout>

item_search.xml

<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="#ffffff" android:layout_margin="10dp" android:layout_marginTop="5dp"> <ImageView android:src="@mipmap/ic_launcher" android:id="@+id/item_search_iv_icon" android:layout_marginLeft="20dp" android:layout_centerVertical="true" android:layout_width="60dp" android:layout_height="60dp"/> <TextView android:id="@+id/item_search_tv_title" android:layout_marginTop="15dp" android:layout_marginLeft="10dp" android:layout_toRightOf="@id/item_search_iv_icon" android:text="Title" android:textSize="15sp" android:textColor="#000" android:layout_width="wrap_content" android:layout_height="wrap_content"/> <TextView android:id="@+id/item_search_tv_content" android:layout_marginLeft="10dp" android:layout_marginBottom="10dp" android:layout_marginRight="50dp" android:layout_toRightOf="@id/item_search_iv_icon" android:layout_below="@id/item_search_tv_title" android:text="content" android:textSize="14sp" android:textColor="#777" android:layout_width="match_parent" android:layout_height="wrap_content"/> <TextView android:id="@+id/item_search_tv_comments" android:layout_marginRight="20dp" android:layout_alignParentRight="true" android:layout_centerVertical="true" android:text="Title" android:singleLine="true" android:textSize="14sp" android:textColor="#777" android:layout_width="wrap_content" android:layout_height="wrap_content"/> </RelativeLayout>

以上就是本文的全部内容,希望能给大家一个参考,也希望大家多多支持脚本之家。

时间: 2024-10-06 20:59:10

自定义搜索功能Android实现的相关文章

自定义搜索功能Android实现_Android

先看看效果图: 源码下载:自定义搜索功能 代码: SearchActivity.java package com.bzu.gxs.search.activity; import android.app.Activity; import android.os.Bundle; import android.support.v7.widget.Toolbar; import android.view.View; import android.widget.AdapterView; import and

搜索更随心,傲游3搜索功能自定义技巧

  傲游3搜索功能使用简单,通过搜索栏.地址栏.起始页,或者选词拖放等均可打开默认搜索引擎进行搜索.傲游3默认搜索引擎为百度,喜欢其他搜索引擎的用户可以在搜索栏下拉菜单修改这个设置.     图一 傲游3搜索栏默认提供了百度.谷歌.有道搜索.傲游多重搜索四个引擎以供选择,如果用户对这四个搜索均不满意,也可以点击"设置"进入搜索引擎设置界面自行调整. 添加新的搜索引擎 想要添加新引擎的用户可以通过点击搜索栏下拉菜单中的"设置"进入设置界面,然后点击页面右上角的&quo

百度站长平台站内搜索功能上线

中介交易 SEO诊断 淘宝客 云主机 技术大厅 你是否在为网站站内搜索的结果不精确而困扰?为站内搜索繁重的服务器及人力开发成本而发愁,为站内搜索的数据更新不及时而苦恼?为了解决上述问题,百度站长平台在2013年推出站内搜索工具,帮助站长轻松打造属于自己的站内搜索引擎. 8月16日-8月25日,百度站长平台推出"3000个站内搜索权限抢先得"活动,活动期间每天送出300个站内搜索权限.只要我们在站长平台上验证了网站,就可以参与活动,一个百度站长平台账号每天有10次抽奖机会,因为是每天上午

Android自定义View——自定义搜索框(SearchView)

概述 在Android开发中,当系统数据项比较多时,常常会在app添加搜索功能,方便用户能快速获得需要的数据.搜索栏对于我们并不陌生,在许多app都能见到它,比如豌豆荚 在某些情况下,我们希望我们的自动补全信息可以不只是纯文本,还可以像豌豆荚这样,能显示相应的图片和其他数据信息,因此Android给我们提供的AutoCompleteTextView往往就不够用,在大多情况下我们都需要自己去实现搜索框. 分析 根据上面这张图,简单分析一下自定义搜索框的结构与功能,有  1. 搜索界面大致由三部门组

Android 实现ListView的A-Z字母排序和过滤搜索功能,实现汉字转成拼音

今天给大家带来ListView的A-Z字母排序和过滤搜索功能并且实现汉字转成拼音的功能,我们知道一般我们对联系人,城市列表等实现A-Z的排序,因为联系人和城市列表我们可以直接从数据库中获取他的汉字拼音,而对于一般的数据,我们怎么实现A-Z的排序,我们需要将汉字转换成拼音就行了,接下来就带大家实现一般数据的A-Z排序功能,首先先看下效果图 上面是一个带删除按钮的EditText,我们在输入框中输入可以自动过滤出我们想要的东西,当输入框中没有数据自动替换到原来的数据列表,然后下面一个ListView

Android 百度地图POI搜索功能实例代码_Android

在没介绍正文之前先给大家说下poi是什么意思. 由于工作的关系,经常在文件中会看到POI这三个字母的缩写,但是一直对POI的概念和含义没有很详细的去研究其背后代表的意思.今天下班之前,又看到了POI这三个字母,决定认认真真的搜索一些POI具体的含义. POI是英文的缩写,原来的单词是point of interest, 直译成中文就是兴趣点的意思.兴趣点这个词最早来自于导航地图厂商.地图厂商为了提供尽可能多的位置信息,花费了很大的精力去寻找诸如加油站,餐馆,酒店,景点等目的地,这些目的地其实都可

Android 仿QQ头像自定义截取功能_Android

看了Android版QQ的自定义头像功能,决定自己实现,随便熟悉下android绘制和图片处理这一块的知识. 先看看效果: 思路分析: 这个效果可以用两个View来完成,上层View是一个遮盖物,绘制半透明的颜色,中间挖了一个圆:下层的View用来显示图片,具备移动和缩放的功能,并且能截取某区域内的图片. 涉及到的知识点: 1.Matrix,图片的移动和缩放 2.Paint的setXfermode方法 3.图片放大移动后,截取一部分 编码实现: 自定义三个View: 1.下层View:ClipP

Android 百度地图POI搜索功能实例代码

在没介绍正文之前先给大家说下poi是什么意思. 由于工作的关系,经常在文件中会看到POI这三个字母的缩写,但是一直对POI的概念和含义没有很详细的去研究其背后代表的意思.今天下班之前,又看到了POI这三个字母,决定认认真真的搜索一些POI具体的含义. POI是英文的缩写,原来的单词是point of interest, 直译成中文就是兴趣点的意思.兴趣点这个词最早来自于导航地图厂商.地图厂商为了提供尽可能多的位置信息,花费了很大的精力去寻找诸如加油站,餐馆,酒店,景点等目的地,这些目的地其实都可

Android实现ListView的A-Z字母排序和过滤搜索功能 实现汉字转成拼音

直入主题,今天给大家带来ListView的A-Z字母排序和过滤搜索功能并且实现汉字转成拼音的功能,我们知道一般我们对联系人,城市列表等实现A-Z的排序,因为联系人和城市列表我们可以直接从数据库中获取他的汉字拼音,而对于一般的数据,我们怎么实现A-Z的排序,我们需要将汉字转换成拼音就行了,接下来就带大家实现一般数据的A-Z排序功能,首先先看下效果图 上面是一个带删除按钮的EditText,我们在输入框中输入可以自动过滤出我们想要的东西,当输入框中没有数据自动替换到原来的数据列表,然后下面一个Lis