Android开发之搜索框自动提示细节MatrixCursor学习

1,在ActionBar里面加入搜索框

在ActionBar里面加入搜索框是现在APP应用的常用做法。要想把搜索做好,可不是那么容易。涉及到自动提示和真正的搜索。下图是我对一个相对完整的搜索框涉及的元素关系做了一个图,箭头只表示它们之间有关系,不是类图中的继承。

一个Activity会有一个ActionBar,默认情况下。你可以在ActionBar里面添加菜单条目。菜单条目可以设置标题,图标以及关联的ActionView,这里我们关联了一个SearchView。SearchView和SearchableInfo关联,和搜索服务关联。同时为了更好的处理关于SearchView的事件响应,我们抽象了一个控制类MovieSearch。它是逻辑控制中心,有搜索完了的跳转SearchActivity(包含SearchFregment),也有内容提示。内容提示主要是根据输入的字进行联想,或者根据历史记录或者热门搜索。所以这里有个SearchHistory,它又和数据表相关。

在加载自动提示的地方,我们用到了一个类MatrixCursor,所以,我们详细的了解这个类的用法。

2,MatrixCursor详解

假如有一个如下的数据库表结构


_id

name

price

R.drawable.ic_launcher
zhangsan 39

R.drawable.ic_launcher
lisi 40

R.drawable.ic_launcher
wangwu 41

R.drawable.ic_launcher

zhaoliu
42

现在咱们就通过MatrixCursor这个东西,来虚构出一张上面那样的表结构,下面通过一个例子,就可以完全理解MatrixCursor这个东西

见示例代码如下:

[java] view
plain
copy

  1. <span style="font-size:14px;">package com.test.matrixcursor;
  2. import android.app.ListActivity;
  3. import android.database.MatrixCursor;
  4. import android.os.Bundle;
  5. import android.support.v4.widget.SimpleCursorAdapter;
  6. import android.view.View;
  7. import android.widget.ListView;
  8. import android.widget.Toast;
  9. public class MainActivity extends ListActivity {
  10. private static final String[] COLUMN_NAME = { "_id", "name", "price" };
  11. private MatrixCursor matrixCursor;
  12. @Override
  13. protected void onCreate(Bundle savedInstanceState) {
  14. super.onCreate(savedInstanceState);
  15. createList();
  16. //createList2();
  17. }
  18. private void createList() {
  19. matrixCursor = new MatrixCursor(COLUMN_NAME, 1);
  20. startManagingCursor(matrixCursor);
  21. matrixCursor.addRow(new Object[] { R.drawable.ic_launcher, "zhangsan",
  22. 39 });
  23. matrixCursor
  24. .addRow(new Object[] { R.drawable.ic_launcher, "lisi", 40 });
  25. matrixCursor
  26. .addRow(new Object[] { R.drawable.ic_launcher, "wangwu", 41 });
  27. matrixCursor.addRow(new Object[] { R.drawable.ic_launcher, "zhaoliu",
  28. 42 });
  29. matrixCursor
  30. .addRow(new Object[] { R.drawable.ic_launcher, "sunqi", 43 });
  31. setListAdapter(new SimpleCursorAdapter(this, R.layout.activity_main,
  32. matrixCursor, COLUMN_NAME, new int[] { R.id.icon, R.id.name,
  33. R.id.price }));
  34. }
  35. private void createList2() {
  36. matrixCursor = new MatrixCursor(COLUMN_NAME, 1);
  37. startManagingCursor(matrixCursor);
  38. MatrixCursor.RowBuilder builder1 = matrixCursor.newRow();
  39. builder1.add(R.drawable.ic_launcher);
  40. builder1.add("zhangsan");
  41. builder1.add(39);
  42. MatrixCursor.RowBuilder builder2 = matrixCursor.newRow();
  43. builder2.add(R.drawable.ic_launcher);
  44. builder2.add("lisi");
  45. builder2.add(40);
  46. MatrixCursor.RowBuilder builder3 = matrixCursor.newRow();
  47. builder3.add(R.drawable.ic_launcher);
  48. builder3.add("wangwu");
  49. builder3.add(41);
  50. setListAdapter(new SimpleCursorAdapter(this, R.layout.activity_main,
  51. matrixCursor, COLUMN_NAME, new int[] { R.id.icon, R.id.name,
  52. R.id.price }));
  53. }
  54. @Override
  55. protected void onListItemClick(ListView l, View v, int position, long id) {
  56. super.onListItemClick(l, v, position, id);
  57. matrixCursor.moveToPosition(position);
  58. StringBuilder builder = new StringBuilder();
  59. builder.append("Name:")
  60. .append(matrixCursor.getString(matrixCursor
  61. .getColumnIndex("name"))).append("\n");
  62. builder.append("Price:")
  63. .append(matrixCursor.getString(matrixCursor
  64. .getColumnIndex("price"))).append("\n");
  65. Toast.makeText(getApplicationContext(), builder.toString(), 1000)
  66. .show();
  67. }
  68. }
  69. </span>

实现步骤仅需3步,下面通过字符数组来说明:

步骤1.首先创建一个字符数组,且字符数组的值对应着表的字段,如下:

String[] COLUMN_NAME = { "_id", "name", "price" };

步骤2.利用MatrixCursor的构造方法,构造一个MatrixCursor,传入的参数即是步骤1中创建的字段数组,如下:

MatrixCursormatrixCursor=newMatrixCursor(COLUMN_NAME);

也可以指定初始大小,如:

matrixCursor=newMatrixCursor( COLUMN_NAME,
10);

步骤3. 通过matrixCursor 的addRow方法添加一行值,相当于向数据库中插入一条记录,如下:

matrixCursor.addRow(new Object[] { R.drawable.ic_launcher, "zhangsan",39 });

注:步骤3也可以通过构造一个MatrixCursor.RowBuilder来实现,也是相当于向数据库中插入一条记录,如下:

MatrixCursor.RowBuilder builder1 = matrixCursor.newRow();

builder1.add(R.drawable.ic_launcher);

builder1.add("zhangsan");

builder1.add(39);

//builder1.add(399999);

通过上面三步即可完成MatrixCursor 的构造。从MatrixCursor 中取出数据的过程与Cursor相同,不再赘述!

注释:如果builder1对象add的数量大于字段的个数,即打开builder1.add(399999);注释,那么将会报以下错误:

02-27 19:00:44.882: W/dalvikvm(29036): threadid=1: thread exiting with uncaught exception (group=0x41e689a8)

02-27 19:00:44.882: W/dalvikvm(29036): threadid=1: uncaught exception occurred

02-27 19:00:44.883: W/System.err(29036): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.test.matrixcursor/com.test.matrixcursor.MainActivity}:android.database.CursorIndexOutOfBoundsException: No more
columns left.

02-27 19:00:44.883: W/System.err(29036):      at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2356)

02-27 19:00:44.883: W/System.err(29036):      at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2408)

02-27 19:00:44.883: W/System.err(29036):      at android.app.ActivityThread.access$600(ActivityThread.java:167)

02-27 19:00:44.883: W/System.err(29036):      at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1378)

02-27 19:00:44.883: W/System.err(29036):      at android.os.Handler.dispatchMessage(Handler.java:107)

02-27 19:00:44.883: W/System.err(29036):      at android.os.Looper.loop(Looper.java:194)

02-27 19:00:44.884: W/System.err(29036):      at android.app.ActivityThread.main(ActivityThread.java:5405)

02-27 19:00:44.884: W/System.err(29036):      at java.lang.reflect.Method.invokeNative(Native Method)

02-27 19:00:44.884: W/System.err(29036):      at java.lang.reflect.Method.invoke(Method.java:525)

02-27 19:00:44.884: W/System.err(29036):      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:838)

02-27 19:00:44.884: W/System.err(29036):      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:605)

02-27 19:00:44.884: W/System.err(29036):      at dalvik.system.NativeStart.main(Native Method)

02-27 19:00:44.886: W/System.err(29036): Caused by: android.database.CursorIndexOutOfBoundsException: No more columns left.

02-27 19:00:44.887: W/System.err(29036):      at android.database.MatrixCursor$RowBuilder.add(MatrixCursor.java:206)

02-27 19:00:44.887: W/System.err(29036):      at com.test.matrixcursor.MainActivity.createList(MainActivity.java:46)

02-27 19:00:44.888: W/System.err(29036):      at com.test.matrixcursor.MainActivity.onCreate(MainActivity.java:20)

02-27 19:00:44.889: W/System.err(29036):      at android.app.Activity.performCreate(Activity.java:5127)

02-27 19:00:44.889: W/System.err(29036):      at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1151)

02-27 19:00:44.890: W/System.err(29036):      at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2320)

程序运行结果:

时间: 2024-10-12 12:37:09

Android开发之搜索框自动提示细节MatrixCursor学习的相关文章

Jquery 搜索框自动提示

为文本框增加自动提示下拉功能,比如输入 1,则从后台数据库查询出包含1 的字段,在文本框增加下拉列表供用户选择 ajax 返回数据为搜索查询字段的json集合 <script src="../../Scripts/JqueryUInew/jquery.autocomplete.js" type="text/javascript"></script> <link href="../../Scripts/JqueryUInew/j

实现搜索框自动提示功能(jquery+php)

客户端代码 <html> <head> <style> #search{font-size:14px;} #search .k{padding:2px 1px; width:320px;} #search_auto{border:1px solid #817FB2; position:absolute; display:none;} #search_auto li{background:#FFF; text-align:left;} #search_auto li.cl

解决android开发中eclipse不能自动提示

Eclipse中window->Preferences->Java->Editor->Content Assist->Advanced->顶部的选项卡Select the proposal kinds contained in the 'default' content assist list: 中把”Java Proposals“ 选项打上勾.

【Android】实现搜索的自动补全功能

[Android]实现搜索的自动补全功能 功能分类:特效 支持平台:Android 运行环境:Eclipse 开发语言:Java 开发工具:Eclipse 源码大小:815.56KB 下载地址:http://www.dwz.cn/x9bUV 源码简介 利用Sqlite模糊查询实现搜索框的自动补全效果(支持字母+汉字补全)欢迎各位小伙伴提供更好的实现思路 运行截图

小练习:用jQuery简单模拟百度搜索框的提示功能

今天第一次接触jQuery,用jQuery模拟了一下百度搜索的自动提示功能.连带jQuery的基本知识点,简单总结如下: 首先得在工程中导入插件:jquery-1.4.2.js ,并在html的head中引入该js: 1 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 2 <html>

Android开发之黑名单来电自动挂断

本实例允许用户动态添加号码到黑名单,并实现黑名单来电自动挂断.程序通过创建PhoneStateListener监听器来监听TelephonyManager的通话状态来实现该功能. 由于自Android 10之后Android不再对外公开挂断电话的API,如果需要挂断电话必须使用AIDL与电话管理Service进行通信,并调用服务中的API实现结束电话. 为了调用远程的AIDL Service,开发者需要将Android源码中的如下两个文拷到指定位置: com.android.internal.t

Android:控件AutoCompleteTextView 客户端保存搜索历史自动提示

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:ori

Android Studio如何设置代码自动提示

在用Eclipse时候,你可以进行设置,设置成不管你输入任何字母,都能进行代码的提示,在Android Studio中也可以 设置,而且比Eclipse设置来的简单.当然如果你觉得代码自动提示会降低你的代码水平,你也可以不设置,在写代码 过程中,如果一时忘记了,你就可以用代码提示的快捷键.android studio代码提示的快捷键是什么呢?看这篇文章: [Android Studio快捷键]之代码提示 接下来说如何设置代码自动提示,如图: 图上内容比较多,我直接按区域划分成6块区域来说吧: 区

Android中的搜索框(SearchView)的功能和用法

1.SearchView是搜索框组件,它可以让用户在文本框里输入文字,通过监听器取得用户的输入,当用户点击搜索时,监听器执行实际的搜索. 2.SearchView组件的常用方法如下: ①setIconifiedByDefault(boolean iconified) ===> 设置搜索框默认是否自动缩小为图标. ②setOnQueryTextListener(SearchView,OnQueryTextListener listener) ===> 为搜索框设置监听器 ③setSubmitBu