SearchView实现自动提示文本(Autocomplete)提示历史记录与删除功能

基本使用

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章