搜索框帶歷史記錄,時時刷新模糊查詢

適配器

public class SearchHistoryAdapter extends RecyclerView.Adapter<SearchHistoryAdapter.MyViewHolder> {

    private Context context;

    private ArrayList<String> historys = new ArrayList<>();

    public SearchHistoryAdapter(Context context, ArrayList<String> historys) {
        this.context = context;
        this.historys = historys;
    }

    @Override
    public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        MyViewHolder holder = new MyViewHolder(LayoutInflater.from(context).
                inflate(R.layout.item_search_history, parent, false));
        return holder;
    }

    @Override
    public void onBindViewHolder(final MyViewHolder holder, final int position) {
        holder.historyInfo.setText(historys.get(position));

        holder.historyInfo.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                iOnItemClickListener.onItemClick(historys.get(position));
            }
        });

        holder.delete.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
//                刪除某條回調
                iOnItemClickListener.onItemDeleteClick(historys.get(position));
            }
        });

    }

    @Override
    public int getItemCount() {
        return historys.size();
    }

    class MyViewHolder extends RecyclerView.ViewHolder {

        TextView historyInfo;
        ImageView delete;

        public MyViewHolder(View view) {
            super(view);
            historyInfo = (TextView) view.findViewById(R.id.tv_item_search_history);
            delete = (ImageView) view.findViewById(R.id.iv_item_search_delete);
        }
    }

    private IOnItemClickListener iOnItemClickListener;

    public void setOnItemClickListener(IOnItemClickListener iOnItemClickListener) {
        this.iOnItemClickListener = iOnItemClickListener;
    }

    public interface IOnItemClickListener {

        void onItemClick(String keyword);

        void onItemDeleteClick(String keyword);

    }
}

數據庫

public class SearchHistoryDB extends SQLiteOpenHelper {

    public static final String DB_NAME = "SearchHistory_db";

    public static final String TABLE_NAME = "SearchHistory";

    private static final String CREATE_TABLE = "create table if not exists " + TABLE_NAME + " ("
            + "id integer primary key autoincrement, "
            + "history text)";

    public SearchHistoryDB(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
        super(context, name, factory, version);
    }

    @Override
    public void onCreate(SQLiteDatabase sqLiteDatabase) {
        sqLiteDatabase.execSQL(CREATE_TABLE);//創建表
    }

    @Override
    public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {

    }

    /**
     * 查詢全部搜索記錄
     */
    public ArrayList<String> queryAllHistory() {
        ArrayList<String> historys = new ArrayList<>();
        //獲取數據庫對象
        SQLiteDatabase db = getReadableDatabase();
        //查詢表中的數據
        Cursor cursor = db.query(TABLE_NAME, null, null, null, null, null, "id desc");
        //獲取name列的索引
        for (cursor.moveToFirst(); !(cursor.isAfterLast()); cursor.moveToNext()) {
            String history = cursor.getString(1);
            historys.add(history);
        }
        cursor.close();//關閉結果集
        db.close();//關閉數據庫對象
        return historys;
    }

    /**
     * 插入數據到數據庫
     */
    public void insertHistory(String keyword) {
        SQLiteDatabase db = getWritableDatabase();
        //生成ContentValues對象
        ContentValues cv = new ContentValues();
        //往ContentValues對象存放數據,鍵-值對模式
        cv.put("history", keyword);
        //調用insert方法,將數據插入數據庫
        db.insert(TABLE_NAME, null, cv);
        //關閉數據庫
        db.close();
    }

    /**
     * 刪除某條數據
     */
    public void deleteHistory(String keyword) {
        SQLiteDatabase db = getWritableDatabase();
        //生成ContentValues對象
        db.delete(TABLE_NAME, "history=?", new String[]{keyword});
        //關閉數據庫
        db.close();
    }

    /**
     * 刪除全部數據
     */
    public void deleteAllHistory() {
        SQLiteDatabase db = getWritableDatabase();
        //刪除全部數據
        db.execSQL("delete from " + TABLE_NAME);
        //關閉數據庫
        db.close();
    }

}

Activity

public class SearchActivity extends BaseActivity implements View.OnClickListener, SearchHistoryAdapter.IOnItemClickListener, SearchLikeAdapter.LikeClick {
    private String TAG=getClass().getName();
    private WakeUpScene wakeUpScene;
    private ImageView imv_searching_back;
    private EditText edt_inputbox;
    private Button btn_sug_search;
    private Drawable drawable;
    private SearchHistoryDB searchHistoryDB;
    //歷史搜索記錄
    private ArrayList<String> allHistorys = new ArrayList<>();
    private ArrayList<String> historys = new ArrayList<>();
    private RecyclerView recyclerview_search_result;
    private SearchHistoryAdapter searchHistoryAdapter;
    private TextView tv_search_clean;
    private InputMethodManager inputMethodManager;
    private AppListBeanDao appListBeanDao;
    private List<AppListBean> appListBeans;
    private RecyclerView recyclerview_search_fuzzy;
    private LinearLayoutManager linearLayoutManager;
    private SearchLikeAdapter searchLikeAdapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_search);
        initData();
    }

    @SuppressLint("ClickableViewAccessibility")
    private void initData() {

        appListBeanDao = MyApp.appListDaoSession.getAppListBeanDao();
        appListBeans = appListBeanDao.loadAll();
        wakeUpScene = new WakeUpScene();
        gobackHome();
        drawable = getResources().getDrawable(R.mipmap.ic_emptyquery_normal);
        edt_inputbox = findViewById(R.id.edt_inputbox);
        btn_sug_search = findViewById(R.id.btn_sug_search);
        imv_searching_back = findViewById(R.id.imv_searching_back);
        tv_search_clean = findViewById(R.id.tv_search_clean);
        recyclerview_search_result = findViewById(R.id.recyclerview_search_result);
        recyclerview_search_fuzzy = findViewById(R.id.recyclerview_search_fuzzy);
        tv_search_clean.setOnClickListener(this);
        btn_sug_search.setOnClickListener(this);
        imv_searching_back.setOnClickListener(this);
        setDeleteDrawable();
        //實例數據庫
        searchHistoryDB = new SearchHistoryDB(MyApp.applicationContext, SearchHistoryDB.DB_NAME, null, 1);
       allHistorys=searchHistoryDB.queryAllHistory();
       setAllHistorys();
        //初始化歷史recyclerView
        recyclerview_search_result.setLayoutManager(new LinearLayoutManager(this));//list類型
        searchHistoryAdapter = new SearchHistoryAdapter(this, historys);
        recyclerview_search_result.setAdapter(searchHistoryAdapter);
        searchHistoryAdapter.setOnItemClickListener(this);
        recyclerview_search_result.setVisibility(View.VISIBLE);
        if (allHistorys.size()>0)tv_search_clean.setVisibility(View.VISIBLE);
        //初始化查詢列表
        linearLayoutManager = new LinearLayoutManager(SearchActivity.this);
        recyclerview_search_fuzzy.setLayoutManager(linearLayoutManager);
        searchLikeAdapter = new SearchLikeAdapter(SearchActivity.this, appListBeans);
        recyclerview_search_fuzzy.setAdapter(searchLikeAdapter);
        recyclerview_search_fuzzy.setVisibility(View.GONE);
        searchLikeAdapter.setLikeClick(this);

        edt_inputbox.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {
                LogUtils.d(TAG, "beforeTextChanged" + " text=" + s + " count" + count);

            }

            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {
                LogUtils.d(TAG, "onTextChanged" + " text=" + s + " count=" + count);
                //todo 正在輸入的時候 模糊搜索顯示列表
                //todo  數據的實時更新?
                if (s!=null&&!s.toString().isEmpty()){
                    refreshQueryLikeList();

                }

            }

            @Override
            public void afterTextChanged(Editable s) {
                LogUtils.d(TAG, "afterTextChanged" + " length=" + s.length());
                String keyword = s.toString();
                if (TextUtils.isEmpty(keyword.trim())) {
                    setAllHistorys();
                    searchHistoryAdapter.notifyDataSetChanged();
                    recyclerview_search_result.setVisibility(View.GONE);
                    recyclerview_search_fuzzy.setVisibility(View.VISIBLE);
                } else {
//                    setKeyWordHistorys(s.toString());
                }
                setDeleteDrawable();
            }
        });

        //todo
        /**
         * edit的觸摸事件
         */
        edt_inputbox.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View view, MotionEvent motionEvent) {
                if (drawable != null && motionEvent.getAction() == MotionEvent.ACTION_UP) {
                    int eventX = (int) motionEvent.getRawX();
                    int eventY = (int) motionEvent.getRawY();
                    Rect rect = new Rect();
                    edt_inputbox.getGlobalVisibleRect(rect);//可見區域相對與屏幕來說的座標位置.
                    rect.left = rect.right - drawable.getIntrinsicWidth();//getIntrinsicWidth 獲取與設置相關的drawable寬度 不是圖片本身寬度
                    if (rect.contains(eventX, eventY)) {
                        edt_inputbox.setText("");
                        //todo 刷新歷史數據庫
                        refreshHistoryList();

                        return true;
                    }
                }
                return false;
            }
        });
        /**
         * 軟鍵盤操作
         */
        edt_inputbox.setOnKeyListener(new View.OnKeyListener() {
            @Override
            public boolean onKey(View v, int keyCode, KeyEvent event) {

                if (keyCode == KeyEvent.KEYCODE_ENTER) {
                    /*隱藏軟鍵盤*/
                    if (inputMethodManager == null) {
                        inputMethodManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
                    }
                    if (inputMethodManager != null && inputMethodManager.isActive()) {
                        inputMethodManager.hideSoftInputFromWindow(v.getApplicationWindowToken(), 0);
                    }
                    recyclerview_search_fuzzy.setVisibility(View.GONE);

                    addItem2HistoryList();
                    refreshQueryLikeList();
                    Toast.makeText(SearchActivity.this,"去搜索:"+edt_inputbox.getText().toString(),Toast.LENGTH_LONG).show();
                    return true;
                }
                if (keyCode == KeyEvent.KEYCODE_DEL){
                    String s = edt_inputbox.getText().toString();
                    if (TextUtils.isEmpty(s.trim())){
                        refreshHistoryList();


                    }


                }
                return false;
            }
        });



    }

    /**
     * 刷新歷史列表
     */
    private void refreshHistoryList() {

        ArrayList<String> strings = searchHistoryDB.queryAllHistory();
        historys.clear();
        historys.addAll(strings);
        searchHistoryAdapter.notifyDataSetChanged();
        recyclerview_search_fuzzy.setVisibility(View.GONE);
        recyclerview_search_result.setVisibility(View.VISIBLE);
        tv_search_clean.setVisibility(View.VISIBLE);
    }

    private void refreshQueryLikeList(){
        String edit_result = edt_inputbox.getText().toString();
        List<AppListBean> list = appListBeanDao.queryBuilder().where(AppListBeanDao.Properties.Ch_name.like("%"+edit_result+"%")).list();
        if (list.size()>0){
            //刷新出模糊查詢的結果列表並顯示
            appListBeans.clear();
            appListBeans.addAll(list);
            searchLikeAdapter.notifyDataSetChanged();
            recyclerview_search_fuzzy.setVisibility(View.VISIBLE);
            recyclerview_search_result.setVisibility(View.GONE);
            tv_search_clean.setVisibility(View.GONE);
            //這裏是不按下搜索鍵盤或者按鈕的時候 只要查出結果就保存到歷史列表
//                       for (AppListBean appListBean : list) {
//                           String ch_name = appListBean.getCh_name();
//                           ArrayList<String> queryAllHistory = searchHistoryDB.queryAllHistory();
//                           if (!queryAllHistory.contains(ch_name)){
//                               searchHistoryDB.insertHistory(ch_name);
//                           }
//                       }
        }else{
            Toast.makeText(SearchActivity.this,"沒有找到匹配的小場景",Toast.LENGTH_LONG).show();
        }
    }
    /***
     *
     * 添加搜索數據到歷史列表
     */
    private void addItem2HistoryList() {
        String searWord = edt_inputbox.getText().toString();
        if (!searWord.equals("")){
            List<AppListBean> list = appListBeanDao.queryBuilder().where(AppListBeanDao.Properties.Ch_name.like("%"+searWord+"%")).list();
            if (list.size()>0){
                for (AppListBean appListBean : list) {
                    ArrayList<String> queryAllHistory = searchHistoryDB.queryAllHistory();
                    String ch_name = appListBean.getCh_name();
                    if (!queryAllHistory.contains(ch_name)){
                        searchHistoryDB.insertHistory(ch_name);
                    }
                }
            }else {
                Toast.makeText(SearchActivity.this,"沒有匹配的小場景",Toast.LENGTH_LONG).show();
            }
        }

    }

    /**
     * 獲取最新數據源
     */
    private void setAllHistorys() {
        historys.clear();
        historys.addAll(allHistorys);

    }

    /**
     * 註冊免喚醒詞
     */
    private void gobackHome() {
        Set<String> wakeupWord  = new HashSet<>();
        wakeupWord.add("返回主界面");
        wakeupWord.add("返回");
        wakeupWord.add("返回上層");
        wakeupWord.add("退出");
        HashMap<String, Set<String>> wordMap = new HashMap<>();
        wordMap.put("好的",wakeupWord);

        WakeUpEvent event = new WakeUpEvent(wordMap, new IWakeupCallback() {
            @Override
            public void onWakeup(long l, String s, String s1) {
                com.tencent.wecarspeech.clientsdk.utils.log.LogUtils.d(TAG,"goback succeed");
                holdTask(l);
                PlayTTS(l,"已爲您返回");
                finish();
                releaseTask(l);
//               onKeyDown(KEYCODE_BACK,)
            }
        });
        wakeUpScene.addWakeupEvent(event);
        SpeechAgent.getInstance().registerWakeUpScene(wakeUpScene);

    }

    /**
     * 在edit末端 放圖片 有字顯示 無字取消
     */
    private void setDeleteDrawable() {
        //文本框沒有內容,則圖片不出現
        if (edt_inputbox.length() == 0) {
            edt_inputbox.setCompoundDrawablesWithIntrinsicBounds(
                    null, null, null, null);
        }
        //文本框有輸入內容時,文本框出現
        else {
            edt_inputbox.setCompoundDrawablesWithIntrinsicBounds(
                    null, null, drawable, null);
//            mEdtInputBox.setCompoundDrawablePadding(R.dimen.dp_18);
        }
    }

    @Override
    protected void onResume() {
        super.onResume();
        if (wakeUpScene!=null){
            SpeechAgent.getInstance().registerWakeUpScene(wakeUpScene);

        }

    }
    @Override
    protected void onPause() {
        super.onPause();
        if (wakeUpScene!=null){
            SpeechAgent.getInstance().unregisterWakeUpScene(wakeUpScene.getSceneId());
        }
    }

    /**
     * 單條搜索記錄
     * @param keyword
     */

    private void setKeyWordHistorys(String keyword) {
        historys.clear();
        for (String string : allHistorys) {
            if (string.contains(keyword)) {
                historys.add(string);
            }
        }
        searchHistoryAdapter.notifyDataSetChanged();
//        recyclerview_search_result.setVisibility(View.VISIBLE);
    }
    /**
     * 點擊單個搜索記錄
     */
    @Override
    public void onItemClick(String keyword) {
//        iOnSearchClickListener.OnSearchClick(keyword);
//        todo 處理搜索結果
       //todo 數據庫 c存英文名字 或者點擊edit上顯示keyword 如果直接跳轉界面需要DB裏面存儲BEAN類 包括ch_name en_name
        edt_inputbox.setText(keyword);
        recyclerview_search_result.setVisibility(View.GONE);
    }
    /**
     * 刪除單個搜索記錄
     *
     *
     */
    @Override
    public void onItemDeleteClick(String keyword) {
        searchHistoryDB.deleteHistory(keyword);
        historys.remove(keyword);
        searchHistoryAdapter.notifyDataSetChanged();
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()){
            case R.id.imv_searching_back:
//                todo
                edt_inputbox.clearFocus();
                hide(this);
                edt_inputbox.setEnabled(false);
                Intent backIntent = new Intent(getApplicationContext(), MainActivity.class);
                startActivity(backIntent);
                overridePendingTransition(0, 0);
                finish();
                break;
            case R.id.btn_sug_search:
                //todo 點擊搜索 觸發事件
                String searWord = edt_inputbox.getText().toString();
                if (TextUtils.isEmpty(searWord.trim())){
                    Toast.makeText(this,"請輸入您想找的小程序",Toast.LENGTH_LONG).show();
                }else {
//                    iOnSearchClickListener.OnSearchClick(searWord);
                    //todo  可以多加一條搜索出結果的添加數據庫
                    hide(this);
                    addItem2HistoryList();
                    refreshQueryLikeList();
                }

                break;
            case R.id.tv_search_clean:
                searchHistoryDB.deleteAllHistory();
                historys.clear();
                tv_search_clean.setVisibility(View.GONE);
                searchHistoryAdapter.notifyDataSetChanged();
                break;

        }
    }

    /**
     * 隱藏軟鍵盤
     * @param context
     */
    public void hide(Context context) {
        View view = getWindow().peekDecorView();
        if (view != null && view.getWindowToken() != null) {
           inputMethodManager = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
            inputMethodManager.hideSoftInputFromWindow(view.getWindowToken(), 0);
        }
    }


    /**
     * 查詢結果監聽
     * @param ch_name
     * @param en_name
     */
    @Override
    public void LikeOnClikc(String ch_name, String en_name) {
        Intent intent = new Intent(this, WebviewActivity.class);
        intent.putExtra("title",ch_name);
        intent.putExtra("en_name",en_name);
        startActivity(intent);
    }

}

layout_searching_bar

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="@dimen/dp_80"
    android:layout_marginTop="@dimen/dp_72"
    android:background="@color/colorActionBar"
    >

    <ImageView
        android:id="@+id/imv_searching_back"
        android:layout_width="@dimen/dp_64"
        android:layout_height="@dimen/dp_64"
        android:layout_marginStart="@dimen/dp_14"
        android:background="@mipmap/ic_back_normal"
        android:layout_centerVertical="true"
        android:scaleType="fitXY" />

    <EditText
        android:id="@+id/edt_inputbox"
        android:layout_width="match_parent"
        android:layout_height="@dimen/dp_56"
        android:textSize="@dimen/sp_30"
        android:hint="@string/edt_inputbox_hint"
        android:paddingLeft="@dimen/dp_23"
        android:paddingRight="@dimen/dp_23"
        android:layout_toRightOf="@+id/imv_searching_back"
        android:layout_toLeftOf="@+id/btn_sug_search"
        android:layout_marginLeft="@dimen/dp_18"
        android:layout_marginRight="@dimen/dp_20"
        android:background="@drawable/edit_text_round"
        android:textColorHint="@color/colorGray2"
        android:textColor="@color/colorWhite"
        android:layout_centerVertical="true"
        android:imeOptions="actionSearch"
        android:maxLines="1"
        android:singleLine="true" />

    <Button
        android:id="@+id/btn_sug_search"
        android:layout_width="@dimen/dp_152"
        android:layout_height="@dimen/dp_56"
        android:layout_marginRight="@dimen/dp_32"
        android:layout_alignParentRight="true"
        android:background="@drawable/button_round"
        android:layout_centerVertical="true"
        android:text="@string/sug_search"
        android:textColor="@drawable/text_clickable_color"
        android:textSize="@dimen/sp_24" />


</RelativeLayout>

activity_search

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".view.SearchActivity">
    <include layout="@layout/layout_searching_bar"
        android:id="@+id/layout_searching_bar"
        />
    <androidx.recyclerview.widget.RecyclerView
        android:layout_below="@id/layout_searching_bar"
        android:id="@+id/recyclerview_search_result"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>
    <TextView
        android:layout_below="@id/recyclerview_search_result"
        android:id="@+id/tv_search_clean"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@drawable/shape_corner_white"
        android:gravity="center"
        android:padding="10dp"
        android:text="清空搜索記錄"
        android:textColor="@color/colorGray2"
        android:textSize="14sp" />
</RelativeLayout>

item_search_history

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:gravity="center_vertical"
    android:orientation="horizontal">

    <TextView
        android:id="@+id/tv_item_search_history"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:drawableLeft="@drawable/ic_history_24dp"
        android:drawablePadding="16dp"
        android:ellipsize="end"
        android:foreground="?android:attr/selectableItemBackground"
        android:gravity="center_vertical"
        android:maxLines="1"
        android:paddingBottom="10dp"
        android:paddingLeft="16dp"
        android:paddingRight="14dp"
        android:paddingTop="10dp"
        android:textColor="@color/text_black"
        android:textSize="14sp"
        tools:text="History" />

    <ImageView
        android:id="@+id/iv_item_search_delete"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginRight="4dp"
        android:background="@color/colorBG"
        android:foreground="?android:attr/selectableItemBackground"
        android:paddingBottom="10dp"
        android:paddingLeft="12dp"
        android:paddingRight="12dp"
        android:paddingTop="10dp"
        android:src="@drawable/ic_close_16dp" />
</LinearLayout>

text_clikable_color

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_focused="true" android:color="@color/colorEditTextHint"></item>
    <item android:state_checked="true" android:color="@color/colorEditTextHint"></item>
    <item android:state_pressed="true" android:color="@color/colorEditTextHint"></item>
    <item android:color="@color/white"/>
</selector>  

ic_close_16dp

<vector xmlns:android="http://schemas.android.com/apk/res/android"
    android:width="16dp"
    android:height="16dp"
    android:viewportHeight="24.0"
    android:viewportWidth="24.0">
    <path
        android:fillColor="#9DA0A3"
        android:pathData="M19,6.41L17.59,5 12,10.59 6.41,5 5,6.41 10.59,12 5,17.59 6.41,19 12,13.41 17.59,19 19,17.59 13.41,12z" />
</vector>

ic_history_24dp

<vector xmlns:android="http://schemas.android.com/apk/res/android"
        android:width="24dp"
        android:height="24dp"
        android:viewportWidth="24.0"
        android:viewportHeight="24.0">
    <path
        android:fillColor="#9DA0A3"
        android:pathData="M13,3c-4.97,0 -9,4.03 -9,9L1,12l3.89,3.89 0.07,0.14L9,12L6,12c0,-3.87 3.13,-7 7,-7s7,3.13 7,7 -3.13,7 -7,7c-1.93,0 -3.68,-0.79 -4.94,-2.06l-1.42,1.42C8.27,19.99 10.51,21 13,21c4.97,0 9,-4.03 9,-9s-4.03,-9 -9,-9zM12,8v5l4.28,2.54 0.72,-1.21 -3.5,-2.08L13.5,8L12,8z"/>
</vector>

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