安卓进阶系列-02搜索框(PersistentSearch)的使用
这篇文章主要介绍安卓开发中常用的搜索框控件的使用。
为第三方控件,需要添加依赖如下。
'com.quinny898.library.persistentsearch:library:1.1.0-SNAPSHOT'
同时因为gradle默认仓库为jcenter,所以build一定会报错。需要在另一个gradle脚本添加仓库。(不是App的而是Project的build.gradle)
1.布局使用
只要在主布局中添加该空间即可。
2.代码实现
package com.zc.test;/*** Created by 16957 on 2018/11/18.*/import android.content.Context;
import android.content.SharedPreferences;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.KeyEvent;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ListView;
import android.widget.TextView;import com.quinny898.library.persistentsearch.SearchBox;
import com.quinny898.library.persistentsearch.SearchResult;import java.util.ArrayList;
import java.util.List;public class MainActivity extends AppCompatActivity {//上下文private Context mContext;//搜索框控件,可以自定义styleprivate SearchBox sbSearch;//底部结果统计控件private TextView tvBottom;//数据列表private List listSearch;//结果列表private List listResult;//历史列表控件private ListView mHistory ;//搜索结果列表控件private ListView mSearchResult ;//底部结果控件private TextView bottom;//两个继承BaseAdapter的适配器,搜索历史sf本地保存private SearchAdapter mResultAdapter ;private HistoryAdapter mHistoryAdapter;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);mContext = this;bindViews();}@Overrideprotected void onResume() {super.onResume();initData();init();initHistory();updateBottom();}private void initData() {//本地可供检索数据获取,每次resume就要重新渲染listSearch = new ArrayList<>();listSearch.add("123");listSearch.add("1234");listSearch.add("12345");}private void bindViews() {mSearchResult = (ListView) findViewById(R.id.lv_content);sbSearch = (SearchBox) findViewById(R.id.searchbox);tvBottom = (TextView) findViewById(R.id.tv_bottom);mHistory = (ListView) findViewById(R.id.lv_history);bottom = (TextView) findViewById(R.id.tv_bottom);}public void init(){//结果的初始化listResult = new ArrayList<>();mResultAdapter = new SearchAdapter(MainActivity.this, listResult);mSearchResult.setAdapter(mResultAdapter);mSearchResult.setOnItemClickListener(new AdapterView.OnItemClickListener() {@Overridepublic void onItemClick(AdapterView> parent, View view, int position, long id) {}});//搜索框的初始化sbSearch.enableVoiceRecognition(this);sbSearch.setMenuListener(new SearchBox.MenuListener(){@Overridepublic void onMenuClick() {finish();}});sbSearch.setSearchListener(new SearchBox.SearchListener(){@Overridepublic void onSearchOpened() {//Use this to tint the screen}@Overridepublic void onSearchClosed() {//Use this to un-tint the screen}@Overridepublic void onSearchTermChanged(String term) {//搜索框内容修改就进行搜索,但只要点击搜索按钮才会加入搜索历史search(term);updateBottom();if(listResult.size()==0){mHistory.setVisibility(View.VISIBLE);}else {mHistory.setVisibility(View.GONE);}}@Overridepublic void onSearch(String searchTerm) {search(searchTerm);saveHistory(searchTerm);initHistory();updateBottom();}@Overridepublic void onResultClick(SearchResult result) {//React to a result being clicked}@Overridepublic void onSearchCleared() {//Called when the clear button is clicked}});}private void initHistory(){final List history = getHistory();mHistoryAdapter = new HistoryAdapter(MainActivity.this,history);mHistory.setAdapter(mHistoryAdapter);mHistory.setOnItemClickListener(new AdapterView.OnItemClickListener() {@Overridepublic void onItemClick(AdapterView> parent, View view, int position, long id) {sbSearch.populateEditText(history.get(position));sbSearch.setSearchString(history.get(position));}});}private void search(String newText){//若搜索内容为空if(newText.isEmpty()){listResult.clear();}else{for (String node : listSearch) {//在数据集遍历搜索if (node.contains(newText)) {if(listResult.indexOf(node)==-1) {//如果结果集不含有它(为了防止结果重复)listResult.add(node);}}else{//搜索内容搜索不到相关 检测是否之前有加入结果集 有则删除if(listResult.indexOf(node)!=-1) {listResult.remove(node);}}}}mResultAdapter.notifyDataSetChanged();}private ArrayList getHistory() {SharedPreferences reader = getSharedPreferences("history", MODE_PRIVATE);String data = reader.getString("data_history", "");ArrayList history = new ArrayList<>();String [] get= data.split("\\|");for( String str:get){if(! history.contains(str) && !str.isEmpty()){history.add(str);}}return history;}private void saveHistory(String s){StringBuilder sb = new StringBuilder();SharedPreferences.Editor editor = getSharedPreferences("history",MODE_PRIVATE).edit();for (String str: getHistory()){sb.append(str);sb.append("|");}sb.append(s);editor.putString("data_history",sb.toString());editor.apply();}private void updateBottom(){if(sbSearch.getSearchText().trim().isEmpty()){bottom.setVisibility(View.GONE);return;}tvBottom.setVisibility(View.VISIBLE);tvBottom.setText("找到了 "+ listResult.size() +" 条记录");}}
3.效果演示


这个项目只是个测试代码,所以组件渲染和事件处理是存在很多bug的,欢迎指正。
项目github地址:https://github.com/luanshiyinyang/TestForPersistentSearch
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
