实现Android搜索功能 显示清除历史搜索记录

本文主要为大家分享了Android实现搜索功能,并且可以实时显示搜索的历史记录,根据输入的内容去模糊查询,供大家参考,界面图如下。

\

 

本案例实现起来也非常的简单,所以可以直接拿来嵌入项目中使用,主要涉及到的知识点:

1、数据库的增删改查操作

2、监听软键盘回车按钮设置为搜索按钮

3、使用TextWatcher( )进行实时筛选

4、已搜索的关键字再次搜索不会重复添加到数据库

既然是要保存搜索记录,首先得建立数据库表:

 

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
/**
  * 搜索记录帮助类
  * Created by 05 on 2016/7/27.
  */
public class RecordSQLiteOpenHelper extends SQLiteOpenHelper {
 
     private final static String DB_NAME = "temp.db" ;
     private final static int DB_VERSION = 1 ;
 
     public RecordSQLiteOpenHelper(Context context) {
         super (context, DB_NAME, null , DB_VERSION);
     }
 
     @Override
     public void onCreate(SQLiteDatabase db) {
         String sqlStr = "CREATE TABLE IF NOT EXISTS records (_id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT);" ;
         db.execSQL(sqlStr);
     }
 
     @Override
     public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
 
     }
}

数据库操作类 ,增删改查都在里面:

 

 

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
/**
  * 搜索记录操作类
  * Created by 05 on 2016/7/27.
  */
public class RecordsDao {
     RecordSQLiteOpenHelper recordHelper;
 
     SQLiteDatabase recordsDb;
 
     public RecordsDao(Context context) {
         recordHelper = new RecordSQLiteOpenHelper(context);
     }
 
     //添加搜索记录
     public void addRecords(String record) {
 
         if (!isHasRecord(record)) {
             recordsDb = recordHelper.getReadableDatabase();
             ContentValues values = new ContentValues();
             values.put( "name" , record);
             //添加
             recordsDb.insert( "records" , null , values);
             //关闭
             recordsDb.close();
         }
     }
 
     //判断是否含有该搜索记录
     public boolean isHasRecord(String record) {
         boolean isHasRecord = false ;
         recordsDb = recordHelper.getReadableDatabase();
         Cursor cursor = recordsDb.query( "records" , null , null , null , null , null , null );
         while (cursor.moveToNext()) {
             if (record.equals(cursor.getString(cursor.getColumnIndexOrThrow( "name" )))) {
                 isHasRecord = true ;
             }
         }
         //关闭数据库
         recordsDb.close();
         return isHasRecord;
     }
 
     //获取全部搜索记录
     public List<string> getRecordsList() {
         List<string> recordsList = new ArrayList<>();
         recordsDb = recordHelper.getReadableDatabase();
         Cursor cursor = recordsDb.query( "records" , null , null , null , null , null , null );
         while (cursor.moveToNext()) {
             String name = cursor.getString(cursor.getColumnIndexOrThrow( "name" ));
             recordsList.add(name);
         }
         //关闭数据库
         recordsDb.close();
         return recordsList;
     }
 
     //模糊查询
     public List<string> querySimlarRecord(String record){
         String queryStr = "select * from records where name like '%" + record + "%' order by name " ;
         List<string> similarRecords = new ArrayList<>();
         Cursor cursor= recordHelper.getReadableDatabase().rawQuery(queryStr, null );
 
         while (cursor.moveToNext()) {
             String name = cursor.getString(cursor.getColumnIndexOrThrow( "name" ));
             similarRecords.add(name);
         }
         return similarRecords;
     }
 
     //清空搜索记录
     public void deleteAllRecords() {
         recordsDb = recordHelper.getWritableDatabase();
         recordsDb.execSQL( "delete from records" );
 
         recordsDb.close();
     }
 
}
</string></string></string></string>

 

 

数据库类已经封装好了,接下来就是界面代码:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<span style= "color:#333333;" ><linearlayout android:layout_height= "match_parent" android:layout_width= "match_parent" android:orientation= "vertical" xmlns:android= "http://schemas.android.com/apk/res/android" >
 
     <linearlayout android:background= "@color/base_green" android:layout_height= "50dp" android:layout_width= "match_parent" >
 
         <linearlayout android:background= "@drawable/input_border_layout" android:layout_height= "match_parent" android:layout_margin= "10dp" android:layout_weight= "1" android:layout_width= "0dp" >
 
             <imageview android:layout_gravity= "center_vertical" android:layout_height= "match_parent" android:layout_width= "30dp" android:padding= "5dp" android:src= "@mipmap/my_village_search" >
 
             <edittext android:id= "@+id/input_search_content_et" android:layout_margin= "5dp" android:textsize= "14sp" span= "" ><span style= "color:#ff0000;" >android:singleLine= "true"
                 android:imeOptions= "actionSearch" </span><span style= "color:#333333;" >
                 android:layout_gravity= "center_vertical"
                 android:background= "@drawable/input_no_border_layout"
                 android:layout_width= "match_parent"
                 android:layout_height= "wrap_content"
                 android:hint= "请输入你要搜索的内容" /></span></edittext></imageview></linearlayout></linearlayout></linearlayout></span>
?
1
2
<span style= "color:#333333;" >
</span>
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<span style= "color:#ff0000;" ><!-- 以上我标红的代码是将弹出的软键盘的回车键替换成搜索键,当然也可以换成发送键 等等,可以去查一下该属性 --></span><span style= "color:#333333;" >
 
         
 
         <textview android:gravity= "center" android:id= "@+id/search_content_cancel_tv" android:layout_gravity= "center_vertical" android:layout_height= "match_parent" android:layout_width= "wrap_content" android:padding= "10dp" android:text= "取消" android:textcolor= "@color/white" android:textsize= "18sp" >
 
     
 
     <relativelayout android:layout_height= "match_parent" android:layout_width= "match_parent" >
 
         <linearlayout android:id= "@+id/search_content_show_ll" android:layout_height= "wrap_content" android:layout_width= "match_parent" android:orientation= "vertical" >
         </linearlayout>
 
     </relativelayout>
 
</textview></span>

因为是将搜索的历史信息做成显示隐藏的效果,所以单独写了一个历史信息的layout:

 

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<!--?xml version= "1.0" encoding= "utf-8" ?-->
<linearlayout android:layout_height= "match_parent" android:layout_width= "match_parent" android:orientation= "vertical" xmlns:android= "http://schemas.android.com/apk/res/android" >
 
     <linearlayout android:layout_height= "wrap_content" android:layout_width= "match_parent" android:orientation= "vertical" >
 
         <listview android:id= "@+id/search_records_lv" android:layout_height= "wrap_content" android:layout_width= "match_parent" >
 
         <view android:background= "@color/custom_gray" android:layout_height= "0.1dp" android:layout_width= "match_parent" >
 
         <textview android:background= "@color/white" android:gravity= "center" android:id= "@+id/clear_all_records_tv" android:layout_height= "40dp" android:layout_width= "match_parent" android:text= "清除历史记录" android:textcolor= "@color/clear_red" android:textsize= "16sp" >
 
         <view android:background= "@color/custom_gray" android:layout_height= "0.1dp" android:layout_width= "match_parent" >
 
     </view></textview></view></listview></linearlayout>
 
</linearlayout>

既然用到了listview来显示历史搜索信息,就需要写listview的item:

 

 

?
1
2
3
4
5
6
7
8
9
10
<!--?xml version= "1.0" encoding= "utf-8" ?-->
<linearlayout android:layout_height= "match_parent" android:layout_width= "match_parent" android:orientation= "vertical" xmlns:android= "http://schemas.android.com/apk/res/android" >
 
     <linearlayout android:background= "@color/white" android:layout_height= "40dp" android:layout_width= "match_parent" android:orientation= "horizontal" >
 
         <textview android:drawableleft= "@mipmap/search_icon" android:drawablepadding= "8dp" android:id= "@+id/search_content_tv" android:layout_gravity= "center_vertical" android:layout_height= "wrap_content" android:layout_margin= "10dp" android:layout_width= "match_parent" >
 
     </textview></linearlayout>
 
</linearlayout>

用到了listview,当然还需要适配器,因为目前只有文本可以使用SimpleAdapter,为了以后能添加别的,我还是自定义了一个Adapter:

 

 

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
/**
  * Created by 05 on 2016/7/27.
  */
public class SearchRecordsAdapter extends BaseAdapter {
 
     private Context context;
     private List<string> searchRecordsList;
     private LayoutInflater inflater;
 
     public SearchRecordsAdapter(Context context, List<string> searchRecordsList) {
         this .context = context;
         this .searchRecordsList = searchRecordsList;
         inflater = LayoutInflater.from(context);
     }
 
     @Override
     public int getCount() {
         return searchRecordsList.size() == 0 ? 0 : searchRecordsList.size();
     }
 
     @Override
     public Object getItem( int position) {
         return searchRecordsList.size() == 0 ? null : searchRecordsList.get(position);
     }
 
     @Override
     public long getItemId( int position) {
         return position;
     }
 
     @Override
     public View getView( int position, View convertView, ViewGroup parent) {
         ViewHolder viewHolder;
         if ( null == convertView){
             viewHolder = new ViewHolder();
             convertView = inflater.inflate(R.layout.saerch_records_list_item, null );
             viewHolder.recordTv = (TextView) convertView.findViewById(R.id.search_content_tv);
 
             convertView.setTag(viewHolder);
         } else {
             viewHolder = (ViewHolder) convertView.getTag();
         }
 
         String content = searchRecordsList.get(position);
         viewHolder.recordTv.setText(content);
 
         return convertView;
     }
 
     private class ViewHolder {
         TextView recordTv;
     }
}</string></string>

最后就是界面代码了:

 

 

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
/**
  * 搜索界面
  * Created by 05 on 2016/7/26.
  */
public class SearchContentActivity extends BaseActivity implements View.OnClickListener {
     private EditText searchContentEt;
     private SearchRecordsAdapter recordsAdapter;
     private View recordsHistoryView;
     private ListView recordsListLv;
     private TextView clearAllRecordsTv;
     private LinearLayout searchRecordsLl;
 
     private List<string> searchRecordsList;
     private List<string> tempList;
     private RecordsDao recordsDao;
 
     @Override
     protected void onCreate(Bundle savedInstanceState) {
         super .onCreate(savedInstanceState);
         BaseSetContentView(R.layout.activity_search_content);
 
         initView();
         initData();
         bindAdapter();
         initListener();
     }
 
     private void initView() {
         setHideHeader();
         initRecordsView();
 
         searchRecordsLl = (LinearLayout) findViewById(R.id.search_content_show_ll);
         searchContentEt = (EditText) findViewById(R.id.input_search_content_et);
 
         //添加搜索view
         searchRecordsLl.addView(recordsHistoryView);
 
     }
 
     //初始化搜索历史记录View
     private void initRecordsView() {
         recordsHistoryView = LayoutInflater.from( this ).inflate(R.layout.search_records_list_layout, null );
         //显示历史记录lv
         recordsListLv = (ListView) recordsHistoryView.findViewById(R.id.search_records_lv);
         //清除搜索历史记录
         clearAllRecordsTv = (TextView) recordsHistoryView.findViewById(R.id.clear_all_records_tv);
     }
 
 
     private void initData() {
         recordsDao = new RecordsDao( this );
         searchRecordsList = new ArrayList<>();
         tempList = new ArrayList<>();
         tempList.addAll(recordsDao.getRecordsList());
 
         reversedList();
         //第一次进入判断数据库中是否有历史记录,没有则不显示
         checkRecordsSize();
     }
 
 
     private void bindAdapter() {
         recordsAdapter = new SearchRecordsAdapter( this , searchRecordsList);
         recordsListLv.setAdapter(recordsAdapter);
     }
 
     private void initListener() {
         clearAllRecordsTv.setOnClickListener( this );
         searchContentEt.setOnEditorActionListener( new TextView.OnEditorActionListener() {
 
             @Override
             public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
                 if (actionId == EditorInfo.IME_ACTION_SEARCH) {
                     if (searchContentEt.getText().toString().length() > 0 ) {
 
                         String record = searchContentEt.getText().toString();
 
                         //判断数据库中是否存在该记录
                         if (!recordsDao.isHasRecord(record)) {
                             tempList.add(record);
                         }
                         //将搜索记录保存至数据库中
                         recordsDao.addRecords(record);
                         reversedList();
                         checkRecordsSize();
                         recordsAdapter.notifyDataSetChanged();
 
                         //根据关键词去搜索
                         
                     } else {
                         ToastUtils.showToast(SearchContentActivity. this , "搜索内容不能为空" );
                     }
                 }
                 return false ;
             }
         });
 
         //根据输入的信息去模糊搜索
         searchContentEt.addTextChangedListener( new TextWatcher() {
             @Override
             public void beforeTextChanged(CharSequence s, int start, int count, int after) {
 
             }
 
             @Override
             public void onTextChanged(CharSequence s, int start, int before, int count) {
 
             }
 
             @Override
             public void afterTextChanged(Editable s) {
                 String tempName = searchContentEt.getText().toString();
                 tempList.clear();
                 tempList.addAll(recordsDao.querySimlarRecord(tempName));
                 reversedList();
                 checkRecordsSize();
                 recordsAdapter.notifyDataSetChanged();
             }
         });
 
         //历史记录点击事件
         recordsListLv.setOnItemClickListener( new AdapterView.OnItemClickListener() {
             @Override
             public void onItemClick(AdapterView<!--?--> parent, View view, int position, long id) {
                 //将获取到的字符串传到搜索结果界面
 
             }
         });
     }
 
     //当没有匹配的搜索数据的时候不显示历史记录栏
     private void checkRecordsSize(){
         if (searchRecordsList.size() == 0 ){
             searchRecordsLl.setVisibility(View.GONE);
         } else {
             searchRecordsLl.setVisibility(View.VISIBLE);
         }
     }
 
     @Override
     public void onClick(View v) {
         switch (v.getId()){
             //清空所有历史数据
             case R.id.clear_all_records_tv:
                 tempList.clear();
                 reversedList();
                 recordsDao.deleteAllRecords();
                 recordsAdapter.notifyDataSetChanged();
                 searchRecordsLl.setVisibility(View.GONE);
                 break ;
         }
     }
 
     //颠倒list顺序,用户输入的信息会从上依次往下显示
     private void reversedList(){
         searchRecordsList.clear();
         for ( int i = tempList.size() - 1 ; i >= 0 ; i --){
             searchRecordsList.add(tempList.get(i));
         }
     }
}
</string></string>

以上就是实现搜索记录存储,搜索信息模糊查询的全部代码了,供大家参考,当然也给自己提供一个整理思路的锻炼。O(∩_∩)O~

URL:http://www.2cto.com/kf/201607/531294.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值