Demo位址:https://github.com/chaoyu168/searchHistory
效果圖:

搜尋界面,顯示搜尋曆史,資料儲存在本地資料庫。詞條維持在10條,短詞條可以在三行全部顯示完,多出的行數隐藏,長詞條預設隻顯示兩行,多出的部分隐藏,點選更多箭頭展示全部詞條,長按出現删除某個詞條彈框,點選清理按鈕可以清除所有曆史記錄。 布局使用到鴻洋大神的流式布局,GitHub位址:https://github.com/hongyangAndroid/FlowLayout
主要代碼:
package com.example.searchhistory;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.constraint.ConstraintLayout;
import android.support.v7.app.AppCompatActivity;
import android.text.TextUtils;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewTreeObserver;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import com.zhy.view.flowlayout.FlowLayout;
import com.zhy.view.flowlayout.TagAdapter;
import com.zhy.view.flowlayout.TagFlowLayout;
import java.util.ArrayList;
import java.util.List;
import butterknife.BindView;
import butterknife.ButterKnife;
import io.reactivex.Observable;
import io.reactivex.ObservableEmitter;
import io.reactivex.ObservableOnSubscribe;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.functions.Consumer;
import io.reactivex.schedulers.Schedulers;
public class MainActivity extends AppCompatActivity {
private RecordsDao mRecordsDao;
//默然展示詞條個數
private final int DEFAULT_RECORD_NUMBER = 10;
private List<String> recordList = new ArrayList<>();
private TagAdapter mRecordsAdapter;
@BindView(R.id.iv_back)
ImageView ivBack;
@BindView(R.id.edit_query)
EditText editText;
@BindView(R.id.iv_clear_search)
ImageView clearSearch;
@BindView(R.id.iv_search)
TextView ivSearch;
@BindView(R.id.cl_toolbar)
ConstraintLayout clToolbar;
@BindView(R.id.tv_history_hint)
TextView tvHistoryHint;
@BindView(R.id.clear_all_records)
ImageView clearAllRecords;
@BindView(R.id.fl_search_records)
TagFlowLayout tagFlowLayout;
@BindView(R.id.iv_arrow)
ImageView moreArrow;
@BindView(R.id.ll_history_content)
LinearLayout mHistoryContent;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ButterKnife.bind(this);
//預設賬号
String username = "a";
//初始化資料庫
mRecordsDao = new RecordsDao(this, username);
initData();
initView();
}
private void initView() {
//建立曆史标簽擴充卡
//為标簽設定對應的内容
mRecordsAdapter = new TagAdapter<String>(recordList) {
@Override
public View getView(FlowLayout parent, int position, String s) {
TextView tv = (TextView) LayoutInflater.from(MainActivity.this).inflate(R.layout.tv_history,
tagFlowLayout, false);
//為标簽設定對應的内容
tv.setText(s);
return tv;
}
};
tagFlowLayout.setAdapter(mRecordsAdapter);
tagFlowLayout.setOnTagClickListener(new TagFlowLayout.OnTagClickListener() {
@Override
public void onTagClick(View view, int position, FlowLayout parent) {
//清空editText之前的資料
editText.setText("");
//将擷取到的字元串傳到搜尋結果界面,點選後搜尋對應條目内容
editText.setText(recordList.get(position));
editText.setSelection(editText.length());
}
});
//删除某個條目
tagFlowLayout.setOnLongClickListener(new TagFlowLayout.OnLongClickListener() {
@Override
public void onLongClick(View view, final int position) {
showDialog("确定要删除該條曆史記錄?", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
//删除某一條記錄
mRecordsDao.deleteRecord(recordList.get(position));
}
});
}
});
//view加載完成時回調
tagFlowLayout.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
boolean isOverFlow = tagFlowLayout.isOverFlow();
boolean isLimit = tagFlowLayout.isLimit();
if (isLimit && isOverFlow) {
moreArrow.setVisibility(View.VISIBLE);
} else {
moreArrow.setVisibility(View.GONE);
}
}
});
moreArrow.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
tagFlowLayout.setLimit(false);
mRecordsAdapter.notifyDataChanged();
}
});
//清除所有記錄
clearAllRecords.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
showDialog("确定要删除全部曆史記錄?", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
tagFlowLayout.setLimit(true);
//清除所有資料
mRecordsDao.deleteUsernameAllRecords();
}
});
}
});
ivSearch.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String record = editText.getText().toString();
if (!TextUtils.isEmpty(record)) {
//添加資料
mRecordsDao.addRecords(record);
}
}
});
clearSearch.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//清除搜尋曆史
editText.setText("");
}
});
mRecordsDao.setNotifyDataChanged(new RecordsDao.NotifyDataChanged() {
@Override
public void notifyDataChanged() {
initData();
}
});
}
private void showDialog(String dialogTitle, @NonNull DialogInterface.OnClickListener onClickListener) {
AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
builder.setMessage(dialogTitle);
builder.setPositiveButton("确定", onClickListener);
builder.setNegativeButton("取消", null);
builder.create().show();
}
private void initData() {
Observable.create(new ObservableOnSubscribe<List<String>>() {
@Override
public void subscribe(ObservableEmitter<List<String>> emitter) throws Exception {
emitter.onNext(mRecordsDao.getRecordsByNumber(DEFAULT_RECORD_NUMBER));
}
}).subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Consumer<List<String>>() {
@Override
public void accept(List<String> s) throws Exception {
recordList.clear();
recordList = s;
if (null == recordList || recordList.size() == 0) {
mHistoryContent.setVisibility(View.GONE);
} else {
mHistoryContent.setVisibility(View.VISIBLE);
}
if (mRecordsAdapter != null) {
mRecordsAdapter.setData(recordList);
mRecordsAdapter.notifyDataChanged();
}
}
});
}
@Override
protected void onDestroy() {
mRecordsDao.closeDatabase();
mRecordsDao.removeNotifyDataChanged();
super.onDestroy();
}
}
在網上還看到通過SharedPreferences進行存儲實作的:
private final static String PREFERENCE_NAME = "superservice_ly";
private final static String SEARCH_HISTORY="linya_history";
// 儲存搜尋記錄
public static void saveSearchHistory(String inputText) {
SharedPreferences sp = App.context.getSharedPreferences(PREFERENCE_NAME, Context.MODE_PRIVATE);
if (TextUtils.isEmpty(inputText)) {
return;
}
String longHistory = sp.getString(SEARCH_HISTORY, ""); //擷取之前儲存的曆史記錄
String[] tmpHistory = longHistory.split(","); //逗号截取 儲存在數組中
List<String> historyList = new ArrayList<String>(Arrays.asList(tmpHistory)); //将改數組轉換成ArrayList
SharedPreferences.Editor editor = sp.edit();
if (historyList.size() > 0) {
//1.移除之前重複添加的元素
for (int i = 0; i < historyList.size(); i++) {
if (inputText.equals(historyList.get(i))) {
historyList.remove(i);
break;
}
}
historyList.add(0, inputText); //将新輸入的文字添加集合的第0位也就是最前面(2.倒序)
if (historyList.size() > 8) {
historyList.remove(historyList.size() - 1); //3.最多儲存8條搜尋記錄 删除最早搜尋的那一項
}
//逗号拼接
StringBuilder sb = new StringBuilder();
for (int i = 0; i < historyList.size(); i++) {
sb.append(historyList.get(i) + ",");
}
//儲存到sp
editor.putString(SEARCH_HISTORY, sb.toString());
editor.commit();
} else {
//之前未添加過
editor.putString(SEARCH_HISTORY, inputText + ",");
editor.commit();
}
}
//擷取搜尋記錄
public static List<String> getSearchHistory(){
SharedPreferences sp = App.context.getSharedPreferences(PREFERENCE_NAME, Context.MODE_PRIVATE);
String longHistory =sp.getString(SEARCH_HISTORY, "");
String[] tmpHistory = longHistory.split(","); //split後長度為1有一個空串對象
List<String> historyList = new ArrayList<String>(Arrays.asList(tmpHistory));
if (historyList.size() == 1 && historyList.get(0).equals("")) { //如果沒有搜尋記錄,split之後第0位是個空串的情況下
historyList.clear(); //清空集合,這個很關鍵
}
return historyList;
}