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(組件)對數據庫進行操作(博友提供)

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