這個功能基本上就是一個搜索補全,以及熱搜提示功能,具體要看服務器給出來的接口需要什麼,基本上這些已經夠用了。
這是功能activity代碼,繼承了公共繼承類BaseActivity。
import android.content.Intent;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.Toast;
import com.ladongjiguang.meikuangwuziyunshu.R;
import com.ladongjiguang.meikuangwuziyunshu.SearchView.Bean;
import com.ladongjiguang.meikuangwuziyunshu.SearchView.SearchAdapter;
import com.ladongjiguang.meikuangwuziyunshu.SearchView.SearchView;
import java.util.ArrayList;
import java.util.List;
/**
* Created by Administrator on 2016/6/14.
*/
public class SearchActivity extends BaseActivity 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<Bean> dbData;
/**
* 熱搜版數據
*/
private List<String> hintData;
/**
* 搜索過程中自動補全數據
*/
private List<String> autoCompleteData;
/**
* 搜索結果的數據
*/
private List<Bean> 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 initView() {
setContentView(R.layout.search_fragment_main_layout);
//返回上一層
Button search_close = (Button) findViewById(R.id.search_btn_back);
search_close.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
SearchActivity.this.finish();
}
});
initData();
initViews();
}
@Override
protected void init() {
}
/*@Override
public void onCreate(Bundle savedInstanceState, PersistableBundle persistentState) {
super.onCreate(savedInstanceState, persistentState);
setContentView(R.layout.home_fragment_search);
Log.d("TAG","打開搜索欄完畢");
}*/
/**
* 初始化視圖
*/
private void initViews() {
lvResults = (ListView) findViewById(R.id.main_lv_search_results);
searchView = (SearchView) findViewById(R.id.main_search_layout);
//設置監聽
searchView.setSearchViewListener(SearchActivity.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, "點擊了"+ resultData.get(position).getTitle(), 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 Bean(R.drawable.img_user_email, "煤礦訂單" + (i + 1), "煤礦歷史訂單", i * 20 + 2 + ""));
}
}
/**
* 獲取熱搜版data 和adapter
*/
private void getHintData() {
hintData = new ArrayList<>(hintSize);
for (int i = 1; i <= hintSize; i++) {
hintData.add("煤礦訂單" + i);
}
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.search_fragment_item_bean_list);
} else {
resultAdapter.notifyDataSetChanged();
}
}
/**
* 當搜索框 文本改變時 觸發的回調 ,更新自動補全數據
* @param text
*/
@Override
public void onRefreshAutoComplete(String text) {
//更新數據
getAutoCompleteData(text);
}
/**
* 點擊搜索鍵時edit text觸發的回調
*
* @param text
*/
@Override
public void onSearch(String text) {
//更新result數據
getResultData(text);
lvResults.setVisibility(View.VISIBLE);
//第一次獲取結果 還未配置適配器
if (lvResults.getAdapter() == null) {
//獲取搜索數據 設置適配器
lvResults.setAdapter(resultAdapter);
} else {
//更新搜索數據
resultAdapter.notifyDataSetChanged();
}
if(resultData.size()>0){
Toast.makeText(this, "完成搜索", Toast.LENGTH_SHORT).show();
}else {
Toast.makeText(this, "沒有找到所需訂單", Toast.LENGTH_SHORT).show();
}
EditText editText = (EditText)findViewById(R.id.search_et_input) ;
String searchWordString = editText.getText().toString();
}
}
這是主頁面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"
tools:context=".activity.SearchActivity"
android:orientation="vertical"
android:background="@color/examine_title_bg">
<com.ladongjiguang.meikuangwuziyunshu.SearchView.SearchView
android:id="@+id/main_search_layout"
android:layout_width="match_parent"
android:layout_height="wrap_content">
</com.ladongjiguang.meikuangwuziyunshu.SearchView.SearchView>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingLeft="10dp"
android:paddingRight="10dp"
android:paddingTop="5dp"
>
<ListView
android:visibility="gone"
android:id="@+id/main_lv_search_results"
android:layout_width="match_parent"
android:layout_height="wrap_content">
</ListView>
</LinearLayout>
</LinearLayout>
這是搜索欄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="wrap_content"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:orientation="vertical">
<LinearLayout
android:background="@color/dark_line"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:gravity="center"
>
<LinearLayout
android:layout_weight="1"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:gravity="center"
>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:padding="10dp">
<EditText
android:paddingLeft="15dp"
android:drawableLeft="@drawable/img_search"
android:drawablePadding="5dp"
android:id="@+id/search_et_input"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="18sp"
android:imeOptions="actionSearch"
android:layout_centerVertical="true"
android:inputType="text"
android:hint="點擊輸入關鍵字"
android:background="@drawable/examine_edit_text_bg"/>
<ImageView
android:visibility="gone"
android:src="@drawable/img_search_iv_delete"
android:id="@+id/search_iv_delete"
android:layout_marginRight="20dp"
android:layout_width="30dp"
android:layout_height="30dp"
android:layout_centerVertical="true"
android:layout_alignRight="@+id/search_et_input"
android:layout_alignEnd="@+id/search_et_input" />
</RelativeLayout>
</LinearLayout>
<Button
android:id="@+id/search_btn_back"
android:layout_marginRight="5dp"
android:layout_marginTop="10dp"
android:layout_marginBottom="10dp"
android:layout_gravity="center_vertical"
android:layout_width="40dp"
android:layout_height="40dp"
android:background="@drawable/bt_search_close"
/>
</LinearLayout>
<ListView
android:visibility="gone"
android:id="@+id/search_lv_tips"
android:layout_marginLeft="20dp"
android:layout_marginRight="20dp"
android:layout_marginBottom="10dp"
android:layout_width="match_parent"
android:layout_height="200dp">
</ListView>
</LinearLayout>
這是搜索結果list的item的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="@color/bottom_tab_bg">
<ImageView
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="5dp"
android:layout_marginLeft="10dp"
android:layout_toRightOf="@id/item_search_iv_icon"
android:text="Title"
android:textSize="18sp"
android:textColor="@color/dark_line"
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="16sp"
android:textColor="@color/dark_line"
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="@color/dark_line"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</RelativeLayout>
以下是控制搜索欄顯示適配代碼,放同一文件夾SearchView內
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.ladongjiguang.meikuangwuziyunshu.R;
/**
* Created by Administrator on 2016/6/15.
*/
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.search_fragment_layout, 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);
// /**
// * 提示列表項點擊時回調方法 (提示/自動補全)
// */
// void onTipsItemClick(String text);
}
}
package com.ladongjiguang.meikuangwuziyunshu.SearchView;
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 yetwish on 2015-05-11
*/
public class ViewHolder {
private SparseArray<View> mViews;
private Context mContext;
private View mConvertView;
private int mPosition;
/**
* init 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;
}
/**
* get 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;
}
/**
* set text
*/
public ViewHolder setText(int viewId, String text){
TextView tv = getView(viewId);
tv.setText(text);
return this;
}
/**
* set image res
*/
public ViewHolder setImageResource(int viewId,int resId){
ImageView iv = getView(viewId);
iv.setImageResource(resId);
return this;
}
/**
* set image bitmap
*/
public ViewHolder setImageBitmap(int viewId,Bitmap bitmap){
ImageView iv = getView(viewId);
iv.setImageBitmap(bitmap);
return this;
}
}
package com.ladongjiguang.meikuangwuziyunshu.SearchView;
import android.content.Context;
import com.ladongjiguang.meikuangwuziyunshu.R;
import java.util.List;
/**
* Created by yetwish on 2015-05-11
*/
public class SearchAdapter extends CommonAdapter<Bean>{
public SearchAdapter(Context context, List<Bean> 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());
}
}
import android.content.Context;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import java.util.List;
/**
* Created by yetwish on 2015-05-11
*/
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 T getItem(int i) {
return mData.get(i);
}
@Override
public long getItemId(int i) {
return i;
}
@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);
}
/**
* Created by Administrator on 2016/6/15.
*/
public class Bean {
private int iconId;
private String title;
private String content;
private String comments;
public Bean(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 String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = 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;
}
}
看起來比較囉嗦,但是這幾個代碼幾乎是不用動直接照搬進去就可,可以完美體現補全功能。
但是做不到智能提示補全,總的來說比較好用。