編輯:關於Android編程
本文主要為大家分享了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(); return isHasRecord; } //獲取全部搜索記錄 public ListgetRecordsList() { List 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(); return recordsList; } //模糊查詢 public List querySimlarRecord(String record){ String queryStr = "select * from records where name like '%" + record + "%' order by name "; List similarRecords = new ArrayList<>(); Cursor cursor= recordHelper.getReadableDatabase().rawQuery(queryStr,null); while (cursor.moveToNext()) { String name = cursor.getString(cursor.getColumnIndexOrThrow("name")); similarRecords.add(name); } return similarRecords; } //清空搜索記錄 public void deleteAllRecords() { recordsDb = recordHelper.getWritableDatabase(); recordsDb.execSQL("delete from records"); recordsDb.close(); } }
數據庫類已經封裝好了,接下來就是界面代碼:
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="請輸入你要搜索的內容"/>
/** * Created by 05 on 2016/7/27. */ public class SearchRecordsAdapter extends BaseAdapter { private Context context; private ListsearchRecordsList; private LayoutInflater inflater; public SearchRecordsAdapter(Context context, List 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 ListsearchRecordsList; private List 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)); } } }
https://github.com/ddwhan0123/Useful-Open-Source-Android往常我們經常會用到SP,大致代碼像這樣:SharedPre
簡介本文介紹一個Android手勢密碼開源庫的使用及實現的詳細過程,該開源庫主要實現以下幾個功能: 支持手勢密碼的繪制,並支持密碼保存功能,解鎖時自動比對密碼給出結果
我們探討了Activity的啟動,從startActivity()到進程創建,再到activity的創建,最後調用onCreate()方法。本篇博客我們接著onCreat
眾所周知,Android系統對硬件擁有較高的要求,使用一段時間以後就會出現速度變慢、多任務處理卡頓的現象,其實通過一些小技巧,便能提升設備的運行速度,大家不