android 搜索demo 有历史记录 逐字检查 清空历史
</pre><pre name="code" class="java"><span style="font-size:14px;">package com.example.search;
import com.example.search.SearchPopuWindow.OnSearch;
import android.app.Activity;
import android.os.Bundle;
import android.view.KeyEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewTreeObserver;
import android.view.ViewTreeObserver.OnGlobalLayoutListener;
import android.widget.Button;
import android.widget.Toast;
public class MainActivity extends Activity {
private SearchPopuWindow popuWindow;
private int higt;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
View view = findViewById(R.id.title);
popuWindow = new SearchPopuWindow(this);
/**
*
*/
popuWindow.setOnSearch(new OnSearch() {
@Override
public void search(View btnView, String searchStr) {
Button button = (Button) btnView;
String t = button.getText().toString();
Toast.makeText(MainActivity.this, t + "" + searchStr,
Toast.LENGTH_LONG).show();
}
});
getHigt(view);
findViewById(R.id.button1).setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
popuWindow.showAsDropDown(v, 0, 0 - higt);
}
});
}
/**
* 提取title高度
*/
private void getHigt(final View view) {
ViewTreeObserver vto2 = view.getViewTreeObserver();
vto2.addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
@SuppressWarnings("deprecation")
@Override
public void onGlobalLayout() {
view.getViewTreeObserver().removeGlobalOnLayoutListener(this);
higt = view.getHeight();
}
});
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK) {
if (popuWindow != null && popuWindow.isShowing()) {
popuWindow.dismiss();
} else {
this.finish();
}
}
return false;
}
}
</span>
SearchAutoAdapter
<span style="font-size:14px;">package com.example.search;
import java.util.ArrayList;
import java.util.List;
import android.annotation.SuppressLint;
import android.content.Context;
import android.content.SharedPreferences;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;
@SuppressLint("DefaultLocale")
public class SearchAutoAdapter extends BaseAdapter {
private Context mContext;
private ArrayList<SearchAutoData> mOriginalValues;// 所有的Item
private List<SearchAutoData> mObjects;// 过滤后的item
private final Object mLock = new Object();
private int mMaxMatch = 10;// 最多显示多少个选项,负数表示全部
public SearchAutoAdapter(Context context, int maxMatch) {
this.mContext = context;
this.mMaxMatch = maxMatch;
initSearchHistory();
mObjects = mOriginalValues;
}
public int getSize() {
return mObjects.size();
}
@Override
public int getCount() {
return null == mObjects ? 0 : mObjects.size();
}
@Override
public Object getItem(int position) {
if (position == mObjects.size()) {
clear();
}
return null == mObjects ? 0 : mObjects.get(position);
}
@Override
public long getItemId(int position) {
return 0;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
AutoHolder holder;
if (convertView == null) {
convertView = LayoutInflater.from(mContext).inflate(
R.layout.seach_list_item, parent, false);
holder = new AutoHolder();
holder.content = (TextView) convertView
.findViewById(R.id.auto_content);
convertView.setTag(holder);
} else {
holder = (AutoHolder) convertView.getTag();
}
SearchAutoData data = mObjects.get(position);
holder.content.setText(data.getContent());
return convertView;
}
/**
* 读取历史搜索记录
*/
public void initSearchHistory() {
SharedPreferences sp = mContext.getSharedPreferences(
SearchPopuWindow.SEARCH_HISTORY, 0);
String longhistory = sp.getString(SearchPopuWindow.SEARCH_HISTORY, "");
String[] hisArrays = longhistory.split(",");
mOriginalValues = new ArrayList<SearchAutoData>();
if (longhistory.equals("")) {
return;
}
for (int i = 0; i < hisArrays.length; i++) {
mOriginalValues.add(new SearchAutoData().setContent(hisArrays[i]));
}
mObjects = mOriginalValues;
notifyDataSetChanged();
}
/**
* 清空历史
*/
public void clear() {
SharedPreferences sp = mContext.getSharedPreferences(
SearchPopuWindow.SEARCH_HISTORY, 0);
sp.edit().putString(SearchPopuWindow.SEARCH_HISTORY, "").commit();
mObjects = null;
mObjects = new ArrayList<SearchAutoData>();
mOriginalValues = null;
mOriginalValues = new ArrayList<SearchAutoData>();
notifyDataSetChanged();
}
/**
* 匹配过滤搜索内容
*
* @param prefix
* 输入框中输入的内容
*/
public void performFiltering(CharSequence prefix) {
if (prefix == null || prefix.length() == 0) {// 搜索框内容为空的时候显示所有历史记录
synchronized (mLock) {
mObjects = mOriginalValues;
}
} else {
String prefixString = prefix.toString().toLowerCase();
int count = mOriginalValues.size();
ArrayList<SearchAutoData> newValues = new ArrayList<SearchAutoData>(
count);
for (int i = 0; i < count; i++) {
final String value = mOriginalValues.get(i).getContent();
final String valueText = value.toLowerCase();
if (valueText.contains(prefixString)) {
}
if (valueText.startsWith(prefixString)) {
newValues.add(new SearchAutoData().setContent(valueText));
} else {
final String[] words = valueText.split(" ");
final int wordCount = words.length;
for (int k = 0; k < wordCount; k++) {
if (words[k].startsWith(prefixString)) {
newValues.add(new SearchAutoData()
.setContent(value));
break;
}
}
}
if (mMaxMatch > 0) {
if (newValues.size() > mMaxMatch - 1) {
break;
}
}
}
mObjects = newValues;
}
notifyDataSetChanged();
}
private class AutoHolder {
TextView content;
}
}</span>
SearchPopuWindow
<span style="font-size:14px;">package com.example.search;
import java.util.ArrayList;
import java.util.Arrays;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.SharedPreferences;
import android.graphics.drawable.BitmapDrawable;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.View;
import android.view.ViewGroup;
import android.view.View.OnClickListener;
import android.widget.AdapterView;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.PopupWindow;
import android.widget.AdapterView.OnItemClickListener;
@SuppressLint("ViewConstructor")
public class SearchPopuWindow extends PopupWindow {
public static final String SEARCH_HISTORY = "search_history";
/**
* 搜索框
*/
private EditText searchEdit;
/**
* 删除叉子
*/
private ImageView delete;
/**
* 搜索按钮
*/
private Button searchBtn;
/**
* 历史搜索
*/
private ListView listView;
private SearchAutoAdapter mSearchAutoAdapter;
private View footer;
private Activity activity;
private boolean hasFooter = false;
@SuppressWarnings("deprecation")
public SearchPopuWindow(Activity activity) {
this.activity = activity;
View view = activity.getLayoutInflater().inflate(R.layout.search_popu,
null);
view.setFocusableInTouchMode(true);
this.setContentView(view);
this.setWindowLayoutMode(ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.MATCH_PARENT);
this.setBackgroundDrawable(new BitmapDrawable());
this.setOutsideTouchable(true);
this.setFocusable(true);
this.setOnDismissListener(new OnDismissListener() {
@Override
public void onDismiss() {
searchEdit.setText("");
}
});
initWidget(view);
}
/**
* 初始化搜索栏控件
*
* @param view
*/
private void initWidget(View view) {
mSearchAutoAdapter = new SearchAutoAdapter(activity, -1);
searchEdit = (EditText) view.findViewById(R.id.etSearch);
delete = (ImageView) view.findViewById(R.id.ivDeleteText);
searchBtn = (Button) view.findViewById(R.id.btnSearch);
listView = (ListView) view.findViewById(R.id.auto_listview);
footer = View.inflate(activity, R.layout.footer, null);
if (haveHistory()) {
listView.addFooterView(footer);
hasFooter = true;
}
listView.setAdapter(mSearchAutoAdapter);
listView.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> arg0, View view,
int position, long arg3) {
if (mSearchAutoAdapter.getSize() == position) {
mSearchAutoAdapter.clear();
listView.removeFooterView(footer);
hasFooter = false;
} else {
SearchAutoData data = (SearchAutoData) mSearchAutoAdapter
.getItem(position);
searchEdit.setText(data.getContent());
searchEdit.setSelection(data.getContent().length());
}
}
});
searchEdit.addTextChangedListener(new TextWatcher() {
public void onTextChanged(CharSequence s, int start, int before,
int count) {
mSearchAutoAdapter.performFiltering(s);
int i = mSearchAutoAdapter.getSize();
if (i == 0) {
if (hasFooter) {
listView.removeFooterView(footer);
hasFooter = false;
}
} else {
if (!hasFooter) {
listView.addFooterView(footer);
listView.setAdapter(mSearchAutoAdapter);
hasFooter = true;
}
}
}
public void beforeTextChanged(CharSequence s, int start, int count,
int after) {
}
public void afterTextChanged(Editable s) {
if (s.length() == 0) {
delete.setVisibility(View.GONE);
searchBtn.setText("取消");
} else {
delete.setVisibility(View.VISIBLE);
searchBtn.setText("搜索");
}
}
});
delete.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
searchEdit.setText("");
}
});
searchBtn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
saveSearchHistory();
mSearchAutoAdapter.initSearchHistory();
search(arg0, searchEdit.getText().toString());
SearchPopuWindow.this.dismiss();
}
});
}
/**
* 有无历史记录
*
* @return
*/
private boolean haveHistory() {
SharedPreferences sp = activity.getSharedPreferences(SEARCH_HISTORY, 0);
String longhistory = sp.getString(SEARCH_HISTORY, "");
if (longhistory.equals("")) {
return false;
} else {
return true;
}
}
/**
* 保存搜索记录
*/
private void saveSearchHistory() {
String text = searchEdit.getText().toString().trim();
if (text.length() < 1) {
return;
}
SharedPreferences sp = activity.getSharedPreferences(SEARCH_HISTORY, 0);
String longhistory = sp.getString(SEARCH_HISTORY, "");
String[] tmpHistory = longhistory.split(",");
ArrayList<String> history = new ArrayList<String>(
Arrays.asList(tmpHistory));
if (history.size() > 0) {
int i;
for (i = 0; i < history.size(); i++) {
if (text.equals(history.get(i))) {
history.remove(i);
break;
}
}
history.add(0, text);
}
if (history.size() > 0) {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < history.size(); i++) {
sb.append(history.get(i) + ",");
}
sp.edit().putString(SEARCH_HISTORY, sb.toString()).commit();
} else {
sp.edit().putString(SEARCH_HISTORY, text + ",").commit();
}
}
/**
* 搜索监听
*
* @param arg0
* button view
* @param str
* 搜索记录
*/
private void search(View btnView, String str) {
onSearch.search(btnView, str);
}
public void setOnSearch(OnSearch onSearch) {
this.onSearch = onSearch;
}
private OnSearch onSearch;
public static interface OnSearch {</span><pre name="code" class="java"><span style="font-size:14px;">package com.example.search;
public class SearchAutoData {
private String id = "";
private String content = "";
public String getId() {
return id;
}
public SearchAutoData setId(String id) {
this.id = id;
return this;
}
public String getContent() {
return content;
}
public SearchAutoData setContent(String content) {
this.content = content;
return this;
}
}
</span>
public void search(View btnView, String searchStr);}}
实体
<span style="font-size:14px;">package com.example.search;
public class SearchAutoData {
private String id = "";
private String content = "";
public String getId() {
return id;
}
public SearchAutoData setId(String id) {
this.id = id;
return this;
}
public String getContent() {
return content;
}
public SearchAutoData setContent(String content) {
this.content = content;
return this;
}
}
</span>
源码下载地址