学习到这部分遇见很多的问题,看了很多人讲的关于这部分的文章同时结合自己的测试总结如下:
程序的目地是在AutoCompleteTextView里面输入联系人名同时自动找出建议的联系人,选取某个联系人后得到该联系人的电话号码。
这里关键是实现一个自己的XXXXXAdapter 继承自CursorAdapter。
要继承CursorAdapter类。必须实现(Override)的方法有:
一 先实现 public Cursor runQueryOnBackgroundThread(CharSequence constraint)
其中constraint就是输入的要查询的关键字,注意当选中输入框的时候,此方法就会被调用,此时constraint = null 如处理不当运行时会报错
这里的返回值Cursor.并将提供给方法public View newView( , ,)使用;
二 然后实现方法public View newView(Context context, Cursor cursor, ViewGroup parent),cursor是上一个方法产生的.这个方法里面需要构造一个在dropdown里显示的view(我把这个view理解为例表中每行显示内容的一个模型,这里可以通过LayoutInflater构造出需要的样式)。这个view作为返回值在bindView( )中还会用到。
三 再是实现方法public void bindView(View view, Context context, Cursor cursor) 。view就是第二步产生的。cursor是第一步产生的。这里就是把corsor里的数据绑定到view中对应的元素中去。注意此方法会多次频繁调用,所以不要有耗时的操作,不然会卡。
四 最后是 public CharSequence convertToString(Cursor cursor) 此方法是在我们选择某个联系人后会显示在AutoCompleteTextView中的内容。
AutoCompleteTextView在布局文件中
android:completionThreshold="1" 表示输入1个字符就显示出建议的联系人
android:completionHint="@string/strHint" 表示在建议例表最后显示的一句话,比如“输入*号给出全部联系人“
以上就是对CursorAdapter的实现。其中的newView()方法很是让我郁闷了很久, 网上找了很久才大概了解了LayoutInflater的主要目地就是把一个布局文件导入到代码中来,下面//线的几行是不同的使用方法。
我的方法是自己写了个ex05_09_cursoradapterview.xml ,里面就是很简单的左边一个TextView显示联系人名,右边一个ImageView用于显示一个小图标。关于这部分网上很多查查就有了。
android.R.layout.simple_dropdown_item_1line
位置:mydroid/frameworks/base/core/res/res/layout/simple_dropdown_item_1line.xml
最后还有程序中使用ContactsContract,我看的书写的是Contacts,似乎是2.0后这个就不建议使用了。这里还有个查找联系人后如何找到属于此人的全部电话号码的问题。
这里提供一个链接 http://hi.baidu.com/wudaovip/blog/item/d7f166df13a8241c495403e7.html