Android之搜索功能的实现
来源:互联网 发布:excel数据有效性自定义 编辑:程序博客网 时间:2024/05/22 23:59
效果图展示:
实现的效果:
1.热门商品搜索栏中的数据从网络接口获取
2.搜索历史商品中的数据从SQLite数据库中获取
3.当点击热门商品搜索的时候,该数据会立刻出现在搜索历史商品中,不会重复增加已经出现过的商品,历史中的商品按照最新时间排序。
4.效果图中的button没有做监听,其实现原理是:获取EditText中的内容,按照服务端的接口格式要求,发送get请求,访问服务端获取相应的数据。
5.搜索历史商品栏的展示数据比较长是由于在bean中对toString 方法做了以下的重写。直接return hotword 也是可以的。
@Override public String toString() { return "SearchDBData [hotword=" + hotword + "]"; }
重要知识点:
1.AsyncTask 的使用:
2.json数据解析:
3.ExpandableListView的使用:
4.表的设计和SQLiteDatabase的增删查改操作:
先贴上代码,后面再对一些重要的代码做解释说明:
public class SearchFragment extends BaseFragment { private ExpandableListView mExpandableListView; private EditText inputEditText; private Button searchButton; private SearchRecommendData recommendData; private ArrayList<String> keywordsList = new ArrayList<String>(); private MyAdapter adapter; private List<SearchDBData> findAllList = new ArrayList<SearchDBData>(); private HistoryDao dao; @Override public void getData() { // 访问网络获取数据:热门搜索 new AsyncTask<Void, Void, Void>() { @Override protected Void doInBackground(Void... params) { String url = "http://xxxxxxxxxxxxxxx"; String json = HttpUtil.get(url, "utf-8"); // recommendData = JSON.parseObject(json, // SearchRecommendData.class); Gson gson = new Gson(); recommendData = gson.fromJson(json, SearchRecommendData.class); keywordsList = recommendData.search_keywords; // 访问数据库获取历史记录 findAllList = dao.findAll(); return null; }; protected void onPostExecute(Void result) { if (adapter == null) { adapter = new MyAdapter(); mExpandableListView.setAdapter(adapter); } else { adapter.notifyDataSetChanged(); } }; }.execute(); } @Override public int getLayoutId() { return R.layout.fragment_search; } @Override public void initView() { dao = new HistoryDao(mContext); // 查找fragment中控件 mExpandableListView = (ExpandableListView) rootView .findViewById(R.id.elv_search); inputEditText = (EditText) rootView .findViewById(R.id.et_input_searchfragment); searchButton = (Button) rootView.findViewById(R.id.btn_searchfragment); mExpandableListView.setGroupIndicator(null); // 对mExpandableListView设置监听事件: MyonChildClickListener childListener = new MyonChildClickListener(); mExpandableListView.setOnChildClickListener(childListener); } private class MyonChildClickListener implements OnChildClickListener { @Override public boolean onChildClick(ExpandableListView parent, View v, int groupPosition, int childPosition, long id) { // Toast.makeText(mContext, keywordsList.get(childPosition), // 0).show(); // String inputStr = inputEditText.getText().toString(); String hotword = keywordsList.get(childPosition); // ContentValues values = new ContentValues(); // values.put("hotword", hotword); // values.put("updatetime",System.currentTimeMillis()); // dao.add(values); dao.addOrUpdate(hotword); findAllList.clear(); findAllList = dao.findAll(); adapter.notifyDataSetChanged(); return true;// 自己处理事情 } } private class MyAdapter extends BaseExpandableListAdapter { @Override public int getGroupCount() { if (findAllList != null) { return 2; } else { return 1; } } @Override public int getChildrenCount(int groupPosition) { // 返回单一组中的数量 if (findAllList != null) { if (groupPosition == 0) { return keywordsList.size(); } else if (groupPosition == 1) { return findAllList.size(); } } return keywordsList.size(); } @Override public Object getGroup(int groupPosition) { if (groupPosition == 0) { return "热门商品搜索";// 初始化组件的时候用到: } else if (groupPosition == 1) { return "搜索历史商品"; } return null; } @Override public Object getChild(int groupPosition, int childPosition) { if (findAllList != null) { if (groupPosition == 0) { return keywordsList.get(childPosition); } else if (groupPosition == 1) { return findAllList.get(childPosition).toString(); } } return keywordsList.get(childPosition); } @Override public long getGroupId(int groupPosition) { // TODO Auto-generated method stub return 0; } @Override public long getChildId(int groupPosition, int childPosition) { // TODO Auto-generated method stub return 0; } @Override public boolean hasStableIds() { // TODO Auto-generated method stub return false; } @Override public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) { View view = View.inflate(mContext, R.layout.search_group, null); TextView groupnameTextView = (TextView) view .findViewById(R.id.tv_name_search); String name = (String) getGroup(groupPosition); groupnameTextView.setText(name); return view; } @Override public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) { String items = (String) getChild(groupPosition, childPosition); View view = View.inflate(mContext, R.layout.search_child, null); TextView childnameTextView = (TextView) view .findViewById(R.id.tv_childname_search); childnameTextView.setText(items); return view; } @Override public boolean isChildSelectable(int groupPosition, int childPosition) { // true:支持点击事件 return true; } }}
先说AsyncTask,由于个人习惯性将获取数据的来源和展示数据写在同一个activity或是fragment中,哪些数据有用,就将哪些数据设置为成员变量,不需要再传递数据了,这是写在同一个类中的好处。
所以在用AsyncTask的时候可以看到传递的参数都是Void的。如果单独将AsyncTask另外开辟一个类来写的话,传递的参数又会有不同。
再说数据库:根据实现效果中的第3点要求:搜索过的商品不能重复,并且最新搜索的放置在第一位,所以设计表的时候一定要带上时间,时间的取值也就是System.currentTimeMillis();
数据库中的关键代码如下:
public void addOrUpdate(String hotword){ SQLiteDatabase db = helper.getWritableDatabase(); String sql = "select id from t_words where hotword = ? "; Cursor cursor = db.rawQuery(sql, new String[]{hotword}); if(cursor.getCount()>0){ //说明数据库中已经有数据:更新数据库的时间: String sql_update = "update t_words set updatetime = ? where hotword = ? "; db.execSQL(sql_update, new String[]{System.currentTimeMillis()+"",hotword}); }else{ //直接插入一条记录: String sql_add = "insert into t_words(hotword,updatetime) values (?,?);"; db.execSQL(sql_add, new String[]{hotword,System.currentTimeMillis()+""}); } cursor.close(); db.close(); }
public List<SearchDBData> findAll(){ List<SearchDBData> data = new ArrayList<SearchDBData>();; SQLiteDatabase db = helper.getReadableDatabase(); Cursor cursor = db.query("t_words", null, null, null, null, null, "updatetime desc"); //遍历游标,将数据存储在 while(cursor.moveToNext()){ SearchDBData searchDBData = new SearchDBData(); searchDBData.id = cursor.getInt(cursor.getColumnIndex("id")); searchDBData.hotword = cursor.getString(cursor.getColumnIndex("hotword")); searchDBData.updatetime = cursor.getLong(cursor.getColumnIndex("updatetime")); data.add(searchDBData); } cursor.close(); db.close(); return data; }
另外:以下是点击事件中的代码,特别要注意2点:(1)往集合中增加数据的时候先清空下集合,避免数据越加越多(2)数据有变更的时候,需要notify下,保持界面的更新。
dao.addOrUpdate(hotword); findAllList.clear(); findAllList = dao.findAll(); adapter.notifyDataSetChanged();
- Android之搜索功能的实现
- Android搜索功能的实现
- android 高德地图之poi搜索功能的实现
- Android搜索功能实现
- Android开发中搜索功能的实现
- 搜索功能的实现
- Android通讯录开发之通讯录联系人搜索功能最新实现
- Android通讯录开发之通讯录联系人搜索功能最新实现
- android实现关键字搜索功能
- android搜索框功能实现
- android 蓝牙搜索功能实现
- Android的开发中搜索功能的实现
- 电商项目笔记之四:搜索功能的实现
- android代码实现搜索机身应用的功能
- Android实现文本框输入一定字数进行搜索的功能
- Android实现搜索功能 AutoCompleteTextView和MultiAutoCompleteTextView的用法
- Android 一般项目的 搜索功能 历史记录排序实现
- Android实现带列表的地图POI周边搜索功能
- HDOJ 1166 敌兵布阵 (树状数组 & 线段树)
- ASP.NET中服务器控件的生命周期
- 判断js中的数据类型
- 怎样把一个遥感影像用C语言进行处理并且输出?
- iOS数据持久化的几种方式
- Android之搜索功能的实现
- [慢查优化]建索引时注意字段选择性 & 范围查询注意组合索引的字段顺序
- Android项目-闪屏界面与GridView
- SQL Server 数据库游标的使用
- 疯狂java讲义--第三章习题 画圆
- block,inline和inline-block概念和区别
- Android项目-自定义组合控件
- 05-树7 堆中的路径
- 为什么需要大数据安全分析?