基本使用
作为第三方组件,无非三步:依赖、布局、配置
具体实现方法:
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(组件)对数据库进行操作(博友提供)