基本使用
作爲第三方組件,無非三步:依賴、佈局、配置
具體實現方法:
1、使用自定義頂部佈局並使用SearchView
2、使用ToolBar(ActionBar)與SearchView結合
其他不再贅述,有很多教程,這裏主要探討自動文本的實現
提示與刪除歷史記錄
個人看了很多方法,比較雜亂,個人思考與總結了一番,實現這個功能主要完成兩個模塊
前端顯示控制
1、獲取AutoComplete組件進行配置
//獲取SearchView中的AutoComplete組件id,個人直接使用R.id.search_src_text沒有獲取到,可能被封裝了
int completeId = searchView.getResources().getIdentifier("android:id/search_src_text", null, null);
//SearchView.AutoComplete 組件的本質就是AutoCompleteTextView,也可以不進行轉換使用
AutoCompleteTextView autoComplete = searchView.findViewById(completeId);
//androidx 包下的獲取
AutoCompleteTextView autoComplete = searchView.findViewById(androidx.appcompat.R.id.search_src_text);
autoComplete.setThreshold(1);
autoComplete.setMaxLines(1);
//適配器視數據源自定義
final RecordAdapter recordAdapter = new RecordAdapter(this,null,true);
autoComplete.setAdapter(recordAdapter);
2、自定義適配器並填入SuggestionsAdapter(SearchView自帶)
final RecordAdapter recordAdapter = new RecordAdapter(this,null,true);
searchView.setSuggestionsAdapter(recordAdapter);
//個人使用CursorAdapter自定義的適配器
public class RecordAdapter extends CursorAdapter {
private DBDao dbDao;
public RecordAdapter(Context context, Cursor c, boolean autoRequery) {
super(context, c, autoRequery);
dbDao = new DBDao(context);
}
@Override
public View newView(Context context, Cursor cursor, ViewGroup parent) {
LayoutInflater inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View view = inflater.inflate(R.layout.item_record,null);
ViewHolder viewHolder = new ViewHolder();
viewHolder.recorText = view.findViewById(R.id.record_text);
viewHolder.recordDelete = view.findViewById(R.id.record_del);
view.setTag(viewHolder);
return view;
}
@Override
public void bindView(View view, Context context, final Cursor cursor) {
ViewHolder holder = (ViewHolder) view.getTag();
holder.recorText.setText(cursor.getString(cursor.getColumnIndex("content")));
holder.recordDelete.setImageResource(R.drawable.record_delete);
holder.recordDelete.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
int recordId = cursor.getInt(0);
dbDao.deleteRecord(recordId);
notifyDataSetChanged();
}
});
}
@Override
public CharSequence convertToString(Cursor cursor) {
return cursor.getString(cursor.getColumnIndex("content"));
}
@Override
public Cursor runQueryOnBackgroundThread(CharSequence constraint) {
return dbDao.ggtRecordByConstraint(constraint.toString());
}
class ViewHolder{
TextView recorText;
ImageView recordDelete;
}
}
數據來源
1、使用SharedPreferences
2、使用SQLite數據庫
a. 自定義dao操作數據(個人教程)
b.使用SearchRecentSuggestionsProvider(組件)對數據庫進行操作(博友提供)