本文主要爲大家分享了Android實現搜索功能,並且可以實時顯示搜索的歷史記錄,根據輸入的內容去模糊查詢,供大家參考,界面圖如下。
本案例實現起來也非常的簡單,所以可以直接拿來嵌入項目中使用,主要涉及到的知識點:
1、數據庫的增刪改查操作
2、監聽軟鍵盤迴車按鈕設置爲搜索按鈕
3、使用TextWatcher( )進行實時篩選
4、已搜索的關鍵字再次搜索不會重複添加到數據庫
既然是要保存搜索記錄,首先得建立數據庫表:
/**
* 搜索記錄幫助類
* Created by 05 on 2016/7/27.
*/
public class RecordSQLiteOpenHelper extends SQLiteOpenHelper {
private final static String DB_NAME = "temp.db";
private final static int DB_VERSION = 1;
public RecordSQLiteOpenHelper(Context context) {
super(context, DB_NAME, null, DB_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
String sqlStr = "CREATE TABLE IF NOT EXISTS records (_id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT);";
db.execSQL(sqlStr);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
}
數據庫操作類 ,增刪改查都在裏面:
/**
* 搜索記錄操作類
* Created by 05 on 2016/7/27.
*/
public class RecordsDao {
RecordSQLiteOpenHelper recordHelper;
SQLiteDatabase recordsDb;
public RecordsDao(Context context) {
recordHelper = new RecordSQLiteOpenHelper(context);
}
//添加搜索記錄
public void addRecords(String record) {
if (!isHasRecord(record)) {
recordsDb = recordHelper.getReadableDatabase();
ContentValues values = new ContentValues();
values.put("name", record);
//添加
recordsDb.insert("records", null, values);
//關閉
recordsDb.close();
}
}
//判斷是否含有該搜索記錄
public boolean isHasRecord(String record) {
boolean isHasRecord = false;
recordsDb = recordHelper.getReadableDatabase();
Cursor cursor = recordsDb.query("records", null, null, null, null, null, null);
while (cursor.moveToNext()) {
if (record.equals(cursor.getString(cursor.getColumnIndexOrThrow("name")))) {
isHasRecord = true;
}
}
//關閉數據庫
recordsDb.close();
cursor.close();
return isHasRecord;
}
//獲取全部搜索記錄
public List<String> getRecordsList() {
List<String> recordsList = new ArrayList<>();
recordsDb = recordHelper.getReadableDatabase();
Cursor cursor = recordsDb.query("records", null, null, null, null, null, null);
while (cursor.moveToNext()) {
String name = cursor.getString(cursor.getColumnIndexOrThrow("name"));
recordsList.add(name);
}
//關閉數據庫
recordsDb.close();
cursor.close();
return recordsList;
}
//模糊查詢
public List<String> querySimlarRecord(String record){
String queryStr = "select * from records where name like '%" + record + "%' order by name ";
List<String> similarRecords = new ArrayList<>();
Cursor cursor= recordHelper.getReadableDatabase().rawQuery(queryStr,null);
while (cursor.moveToNext()) {
String name = cursor.getString(cursor.getColumnIndexOrThrow("name"));
similarRecords.add(name);
}
cursor.close();
return similarRecords;
}
//清空搜索記錄
public void deleteAllRecords() {
recordsDb = recordHelper.getWritableDatabase();
recordsDb.execSQL("delete from records");
recordsDb.close();
}
}
數據庫類已經封裝好了,接下來就是界面代碼:
<span style="color:#333333;"><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:background="@color/base_green"
android:layout_width="match_parent"
android:layout_height="50dp">
<LinearLayout
android:layout_margin="10dp"
android:background="@drawable/input_border_layout"
android:layout_weight="1"
android:layout_width="0dp"
android:layout_height="match_parent">
<ImageView
android:padding="5dp"
android:layout_gravity="center_vertical"
android:layout_width="30dp"
android:layout_height="match_parent"
android:src="@mipmap/my_village_search"/>
<EditText
android:id="@+id/input_search_content_et"
android:layout_margin="5dp"
android:textSize="14sp"
android:singleLine="true"
android:imeOptions="actionSearch"
android:layout_gravity="center_vertical"
android:background="@drawable/input_no_border_layout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="請輸入你要搜索的內容"/></span>
<!-- 以上的singleLine和imeOptions屬性代碼是將彈出的軟鍵盤的回車鍵替換成搜索鍵的關鍵,當然也可以換成發送鍵 等等,可以去查一下該屬性 --></span>
</LinearLayout>
<TextView
android:id="@+id/search_content_cancel_tv"
android:padding="10dp"
android:layout_gravity="center_vertical"
android:gravity="center"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:textSize="18sp"
android:text="取消"
android:textColor="@color/white"/>
</LinearLayout>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:orientation="vertical"
android:id="@+id/search_content_show_ll"
android:layout_width="match_parent"
android:layout_height="wrap_content">
</LinearLayout>
</RelativeLayout>
</LinearLayout></span>
因爲是將搜索的歷史信息做成顯示隱藏的效果,所以單獨寫了一個歷史信息的layout:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<ListView
android:id="@+id/search_records_lv"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
<View
android:layout_width="match_parent"
android:layout_height="0.1dp"
android:background="@color/custom_gray"/>
<TextView
android:background="@color/white"
android:id="@+id/clear_all_records_tv"
android:layout_width="match_parent"
android:layout_height="40dp"
android:textSize="16sp"
android:gravity="center"
android:textColor="@color/clear_red"
android:text="清除歷史記錄"/>
<View
android:layout_width="match_parent"
android:layout_height="0.1dp"
android:background="@color/custom_gray"/>
</LinearLayout>
</LinearLayout>
既然用到了listview來顯示歷史搜索信息,就需要寫listview的item:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:background="@color/white"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="40dp">
<TextView
android:id="@+id/search_content_tv"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:drawableLeft="@mipmap/search_icon"
android:drawablePadding="8dp"
android:layout_margin="10dp"
android:layout_gravity="center_vertical"
/>
</LinearLayout>
</LinearLayout>
用到了listview,當然還需要適配器,因爲目前只有文本可以使用SimpleAdapter,爲了以後能添加別的,我還是自定義了一個Adapter:
/**
* Created by 05 on 2016/7/27.
*/
public class SearchRecordsAdapter extends BaseAdapter {
private Context context;
private List<String> searchRecordsList;
private LayoutInflater inflater;
public SearchRecordsAdapter(Context context, List<String> searchRecordsList) {
this.context = context;
this.searchRecordsList = searchRecordsList;
inflater = LayoutInflater.from(context);
}
@Override
public int getCount() {
return searchRecordsList.size() == 0 ? 0 : searchRecordsList.size();
}
@Override
public Object getItem(int position) {
return searchRecordsList.size() == 0 ? null : searchRecordsList.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder viewHolder;
if(null == convertView){
viewHolder = new ViewHolder();
convertView = inflater.inflate(R.layout.saerch_records_list_item,null);
viewHolder.recordTv = (TextView) convertView.findViewById(R.id.search_content_tv);
convertView.setTag(viewHolder);
}else{
viewHolder = (ViewHolder) convertView.getTag();
}
String content = searchRecordsList.get(position);
viewHolder.recordTv.setText(content);
return convertView;
}
private class ViewHolder {
TextView recordTv;
}
}
最後就是界面代碼了:
/**
* 搜索界面
* Created by 05 on 2016/7/26.
*/
public class SearchContentActivity extends BaseActivity implements View.OnClickListener {
private EditText searchContentEt;
private SearchRecordsAdapter recordsAdapter;
private View recordsHistoryView;
private ListView recordsListLv;
private TextView clearAllRecordsTv;
private LinearLayout searchRecordsLl;
private List<String> searchRecordsList;
private List<String> tempList;
private RecordsDao recordsDao;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
BaseSetContentView(R.layout.activity_search_content);
initView();
initData();
bindAdapter();
initListener();
}
private void initView() {
setHideHeader();
initRecordsView();
searchRecordsLl = (LinearLayout) findViewById(R.id.search_content_show_ll);
searchContentEt = (EditText) findViewById(R.id.input_search_content_et);
//添加搜索view
searchRecordsLl.addView(recordsHistoryView);
}
//初始化搜索歷史記錄View
private void initRecordsView() {
recordsHistoryView = LayoutInflater.from(this).inflate(R.layout.search_records_list_layout, null);
//顯示歷史記錄lv
recordsListLv = (ListView) recordsHistoryView.findViewById(R.id.search_records_lv);
//清除搜索歷史記錄
clearAllRecordsTv = (TextView) recordsHistoryView.findViewById(R.id.clear_all_records_tv);
}
private void initData() {
recordsDao = new RecordsDao(this);
searchRecordsList = new ArrayList<>();
tempList = new ArrayList<>();
tempList.addAll(recordsDao.getRecordsList());
reversedList();
//第一次進入判斷數據庫中是否有歷史記錄,沒有則不顯示
checkRecordsSize();
}
private void bindAdapter() {
recordsAdapter = new SearchRecordsAdapter(this, searchRecordsList);
recordsListLv.setAdapter(recordsAdapter);
}
private void initListener() {
clearAllRecordsTv.setOnClickListener(this);
searchContentEt.setOnEditorActionListener(new TextView.OnEditorActionListener() {
@Override
public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
if (actionId == EditorInfo.IME_ACTION_SEARCH) {
if (searchContentEt.getText().toString().length() > 0) {
String record = searchContentEt.getText().toString();
//判斷數據庫中是否存在該記錄
if (!recordsDao.isHasRecord(record)) {
tempList.add(record);
}
//將搜索記錄保存至數據庫中
recordsDao.addRecords(record);
reversedList();
checkRecordsSize();
recordsAdapter.notifyDataSetChanged();
//根據關鍵詞去搜索
} else {
ToastUtils.showToast(SearchContentActivity.this, "搜索內容不能爲空");
}
}
return false;
}
});
//根據輸入的信息去模糊搜索
searchContentEt.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
}
@Override
public void afterTextChanged(Editable s) {
String tempName = searchContentEt.getText().toString();
tempList.clear();
tempList.addAll(recordsDao.querySimlarRecord(tempName));
reversedList();
checkRecordsSize();
recordsAdapter.notifyDataSetChanged();
}
});
//歷史記錄點擊事件
recordsListLv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
//將獲取到的字符串傳到搜索結果界面
}
});
}
//當沒有匹配的搜索數據的時候不顯示歷史記錄欄
private void checkRecordsSize(){
if(searchRecordsList.size() == 0){
searchRecordsLl.setVisibility(View.GONE);
}else{
searchRecordsLl.setVisibility(View.VISIBLE);
}
}
@Override
public void onClick(View v) {
switch (v.getId()){
//清空所有歷史數據
case R.id.clear_all_records_tv:
tempList.clear();
reversedList();
recordsDao.deleteAllRecords();
recordsAdapter.notifyDataSetChanged();
searchRecordsLl.setVisibility(View.GONE);
break;
}
}
//顛倒list順序,用戶輸入的信息會從上依次往下顯示
private void reversedList(){
searchRecordsList.clear();
for(int i = tempList.size() - 1 ; i >= 0 ; i --){
searchRecordsList.add(tempList.get(i));
}
}
}
以上就是實現搜索記錄存儲,搜索信息模糊查詢的全部代碼了,供大家參考,當然也給自己提供一個整理思路的鍛鍊。O(∩_∩)O~