CursorAdapter

继承于BaseAdapter是个虚类,它为cursor和ListView提供了连接的桥梁。           
public abstract class
    CursorAdapter
        extends BaseAdapter
直接子类只有ResourceCursorAdapter
Class Overview
Adapter that exposes data from a Cursor to a ListView widget. 
The Cursor must include a column named "_id" or this class will not work.
注意cursor的必须要有个命名为"_id"的列。比如Contacts._ID就为"_id"
必须实现以下函数
abstract View newView(Context  context, Cursor  cursor, ViewGroup  parent)
    Makes a new view to hold the data pointed to by cursor.
abstract void  bindView(View  view, Context  context, Cursor  cursor)
    Bind an existing view to the data pointed to by cursor
注意
newView该函数第一次回调用后,如果数据增加后也会再调用,但是重绘是不会调用的。
数据增加后,回调用该函数来生成与新增数据相对应的view。
bindView函数第一次回调用后,如果数据更新也会再调用,但重绘会再次调用的。
【总的来说应该是在调用bindView如果发现view为空会先调用newView来生成view】
import android.app.Activity;
import android.app.ListActivity;
import android.os.Bundle;
import android.os.Handler;
import android.content.Context;
import android.content.ContentValues;
import android.database.Cursor;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.ListView;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.CursorAdapter;
import android.widget.TextView;
import android.provider.ContactsContract.Contacts;
import android.provider.ContactsContract.RawContacts;
import android.view.View.OnClickListener;
import android.widget.Button;
public class HelloCursor extends ListActivity {
private static String[] PROJECTION = new String[] { Contacts._ID,
Contacts.DISPLAY_NAME }; /** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Cursor c = getContentResolver().query(Contacts.CONTENT_URI, PROJECTION,
null, null, Contacts.DISPLAY_NAME + " COLLATE NOCASE");
startManagingCursor(c);
MyCursorAdapter adapter = new MyCursorAdapter(this, R.layout.list_row,
c);
this.setListAdapter(adapter);
Button button = (Button)findViewById(R.id.Button01);
OnClickListener listener=new OnClickListener(){
@Override
public void onClick(View v) {
doAction();
}
};
button.setOnClickListener(listener);
mHandler = new Handler(); } private String[] mStrings = { "hubin", "hudashi", "robin" };
int cnt = ;
private Handler mHandler; class AddContactThread implements Runnable {
public void run() {
int nStringLength = mStrings.length;
int randomNumber = ;
ContentValues newValues = new ContentValues();
String tempString = null;
randomNumber = (int) (Math.random() % );
for (int i = ; i < nStringLength; i++) {
tempString = mStrings + cnt + randomNumber;
newValues.put(Contacts.DISPLAY_NAME, tempString);
getContentResolver().insert(RawContacts.CONTENT_URI, newValues);
newValues.clear(); }
cnt++;
}
}
AddContactThread addContact=new AddContactThread();
void doAction()
{
mHandler.post(addContact);
}
}
class MyCursorAdapter extends CursorAdapter {
Context context=null;
int viewResId;
public MyCursorAdapter(Context context, int resource, Cursor cursor) {
super(context,cursor);
viewResId=resource;
}
public View newView(Context context, Cursor cursor, ViewGroup parent) { TextView view =null;
LayoutInflater vi = null;
vi = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
view =(TextView)vi.inflate(viewResId, parent, false);
//v =(TextView)vi.inflate(textViewResourceId,null);
Log.i("hubin","newView"+view);
return view;
}
@Override
public void bindView(View view, Context context, Cursor cursor) {
Log.i("hubin","bind"+view);
TextView nameView = (TextView) view;
// Set the name
nameView.setText(cursor
.getString(cursor.getColumnIndex("DISPLAY_NAME")));
}
}
一、结构

public abstract class CusrorAdapter extends BaseAdpater implements Filterable

java.lang.Object

android.widget.BaseAdapter

         android.widget.CursorAdapter

直接子类

      ResourceCursorAdapter

间接子类

SimpleCursorAdapter

  二、概述

    通过该类可以用Cursor的方式访问数据库,并将查询出来的数据展示到列表视图(ListView)部件上。其中游标携带的结果集中必须有列名为“_id”的列,否则这个类无法工作。

  三、构造函数

    public CusorAdapter(Context context,Cursor c)   

           构造函数。每当数据库的数据发生改变时,适配器将调用requery()重新查询以显示最新的数据。

             参数

       context        应用程序上下文。

  c                 用来获取数据的游标(Coursor)

    public CusorAdapter(Context context,Cursor c, boolean autoRequery)       

  构造函数。每当数据库的数据发生改变时,适配器将调用requery()重新查询以显示最新的数据。

             参数

       context        应用程序上下文。

  c                 用来获取数据的Coursor

                      autoRequry     设置为true时,每当数据库的数据发生改变时,适配器将调用requery()重新查询以显示最新的数据。

  四、公共方法

  public abstract void bindView (View view, Context context, Cursor cursor)

  重用一个已有的view,使其显示当前cursor所指向的数据。

  参数

                   view                已存在的视图, 返回之前newView方法创建的视图。

                   context          应用程序上下文

                   cursor               用于获取数据的Coursor。Coursor已经移到正确的位置。

  public void changeCursor (Cursor cursor)

           更改底层的游标为新传入的游标。如果游标已经存在则先关闭这个已存在的游标。

  参数                  

                   cursor               新Cursor。

  public CharSequence convertToString (Cursor cursor)

           将cursor转换成CharSequence。子类应该重写这个方法并转换它们的结果。这个方法的默认实现是:当cursor为空时返回一个空串,否则直接返回调用cursor的toString()方法。

  参数        

                   cursor               将cursor转换成CharSequence对象。

           返回值

             返回表示CharSequence的值。

  public int getCount ()

         (译者注:获取适配器中数据的总行数。)

             参见

                      getCount()

  public Cursor getCursor ()

           返回当前适配器绑定的Cursor对象。

  返回值

            Cursor对象。

  public View getDropDownView (int position, View convertView, ViewGroup parent)

  获取下拉列表选项指定位置的视图对象

  参数

           position  视图(View)对象的行索引。

           convertView       重用已有的视图(View)对象。备注:在使用前你应该检查一下这个视图对象是否非空并且这个对象的类型是否合适。由此引伸出,如果该对象不能被转换并显示正确的数据,这个方法内部就会重新创建一个合适的视图(View)对象。

           parent  不管是转换后的还是重新创建的视图(View)对象,始终都会依附于parent对象上。

  返回值    

                   返回视图(View)对象,该对象显示数据集指定位置上的数据。

  public Filter getFilter ()

  返回一个可以通过一种过滤模式来约束数据的过滤器。

  这个方法通常在Adapter类实现。

  返回值

                   一个用于约束数据的过滤器

  public FilterQueryProvider getFilterQueryProvider ()

  返回一个提供过滤的查询过滤器。若过滤器为null,则不再过滤。

  返回值

                   返回当前过滤器对象,如果不存在返回null。

                 参见

                   setFilterQueryProvider(android.widget.FilterQueryProvider)

                   runQueryOnBackgroundThread(CharSequence)

  public Object getItem (int position)

  (译者注:获取数据集中指定位置上的数据项目)

                  参见

                       getItem(int)

  public long getItemId (int position)

         (译者注:获取数据集中的指定位置上的行id。)

             参见

                       getItemId(int)

  public View getView (int position, View convertView, ViewGroup parent)

  (译者注:获取一个显示数据集中指定位置数据段视图。可以手动创建视图,或者从XML设计文件填充。当视图从XML设计文件填充时,父视图(如GridView,ListView等)将接受默认的设计参数,除非使用inflate(int, android.view.ViewGroup, boolean)去指定一个根视图和防止依附于根视图。)

        参见

                   getView(int, View, ViewGroup)

  public boolean hasStableIds ()

无论项ID代表的基础数据的是否变化都保持不变。

      返回值

  如果为TRUE,意味着相同的ID始终引用相同的对象。

  public View newDropDownView (Context context, Cursor cursor, ViewGroup parent)

  生成一个新的下拉视图来保存cursor指向的数据

           参数

             context  应用程序全局信息接口(应用上下文)

  cursor  获取数据的游标,它已经移动到正确的位置

  parent 与新视图相关联的上级视图

  返回值

  新创建的视图。

  public abstract View newView (Context context, Cursor cursor, ViewGroup parent)

  新建一个视图来保存cursor指向的数据

           参数

             context  应用程序全局信息接口(应用上下文)

  cursor  获取数据的游标,它已经移动到正确的位置

  parent 与新视图相关联的上级视图

  返回值

                   新创建的视图。

  public Cursor runQueryOnBackgroundThread (CharSequence constraint)

  执行含指定约束的查询。此查询依赖于适配器的过滤器。查询是由FilterQueryProvider提供。如果没有指定FilterQueryProvider,当前cursor不过滤只返回。该方法会通过changeCursor(Cursor)方法返回一个Cursor对象,并且关闭掉先前的Cursor对象。这个方法始终在后台线程执行,而不是在应用程序的主线程(或是UI线程)中运行。规定:当参数constraint为null或为空时,该方法返回原始结果。

        参数

              constraint 该查询必须被过滤的约束。

  返回值

  返回含有新的查询结果的Cursor。

  参考

         getFilter()

getFilterQueryProvider()

               setFilterQueryProvider(android.widget.FilterQueryProvider)

  public void setFilterQueryProvider (FilterQueryProvider filterQueryProvider)

  设置一个过滤器,用来过滤当前的Cursor对象。当这个适配器需要进行过滤操作时, runQuery(CharSequence)方法被调用。

       参数

  filterQueryProvider  过滤器对象,设置为null时,就相当于移除了该过滤器。

                参考

                       getFilterQueryProvider()

runQueryOnBackgroundThread(CharSequence)

  五、受保护方法

  protected void init (Context context, Cursor c, boolean autoRequery)

  (译者注:供构造函数使用初始化相关参数)

  protected void onContentChanged ()
     当cursor对象上的ContentObserver接收到改变的通知时就会调用该方法,其默认实现提供了自动重新查询方式,但可以被子类重写。

Android CursorAdapter的更多相关文章

  1. Android CursorAdapter的使用

    CursorAdapter继承于BaseAdapter,为Cursor和ListView连接提供了桥梁. 首先看一下CursorAdapter的部分源码: /** * @see android.wid ...

  2. Android CursorAdapter的使用详解

    一.CursorAdapter介绍 CursorAdapter这个类是继承于BaseAdapter的它是一个虚类它为Cursor和ListView连接提供了桥梁 二.CursorAdapter详解 1 ...

  3. Android 3.0 r1 API中文文档(108) —— ExpandableListAdapter

    前言 本章内容是android.widget.ExpandableListAdapter,版本为Android 3.0  r1,翻译来自"深夜未眠",欢迎访问它的博客:" ...

  4. 使用具体解释及源代码解析Android中的Adapter、BaseAdapter、ArrayAdapter、SimpleAdapter和SimpleCursorAdapter

    Adapter相当于一个数据源,能够给AdapterView提供数据.并依据数据创建相应的UI.能够通过调用AdapterView的setAdapter方法使得AdapterView将Adapter作 ...

  5. Android开发——利用Cursor+CursorAdapter实现界面实时更新

    好久没有更新博客了.不是没时间写,而是太懒.而且感觉有些东西没有时间总结,之之后再想写,就想不起来了.晚上新发现一点东西,所以就及时写下来. 最近利用业余时间在看Android的Download模块, ...

  6. 【Android】13.2 使用自定义的CursorAdapter访问SQLite数据库

    分类:C#.Android.VS2015: 创建日期:2016-02-26 一.简介 SQliteDemo1的例子演示了SimpleCursorAdapter的用法,本节我们将使用用途更广的自定义的游 ...

  7. Android如果动态改变CursorAdapter Item个数

    //adapter内部类 private class SearchAdapter extends CursorAdapter { @Override public View newView(Conte ...

  8. Android MVP模式 谷歌官方代码解读

    Google官方MVP Sample代码解读 关于Android程序的构架, 当前(2016.10)最流行的模式即为MVP模式, Google官方提供了Sample代码来展示这种模式的用法. Repo ...

  9. Android软件开发之ListView 详解【转】

    ListView的使用方法  ListView是Android软件开发中非常重要组件之一,基本上是个软件基本都会使用ListView ,今天我通过一个demo来教大家怎么样使用ListView组件 绘 ...

随机推荐

  1. ORTP库API使用入门

    一.简介 ORTP是一个支持RTP以及RFC3550协议的库,有如下的特性: (1)使用C语言编写,可以工作于windows, Linux, 以及 Unix平台 (2)实现了RFC3550协议,提供简 ...

  2. linux下 tags相关

    在vim中配置好了YouCompleteMe插件,发现把光标移动到函数名下再按ctrl+],并不能跳转到该函数的定义处.解决办法: 1.先查看有没有安装ctags,运行ctags –version查看 ...

  3. redis 学习笔记三(队列功能)

    Redis队列功能介绍 List 常用命令: Blpop删除,并获得该列表中的第一元素,或阻塞,直到有一个可用 Brpop删除,并获得该列表中的最后一个元素,或阻塞,直到有一个可用 Brpoplpus ...

  4. 设计模式之(二)Adapter模式

    今天学习Adapter模式,An adapter helps two incompatible interfaces to work together. This is the real world ...

  5. 5狐网教你从零基础做Firefox os 手机应用开发赚money

    如果你还没有接触过web编程,这里有基础教程教你怎样一步一步学习开发,如果你已经是一个web编程基础的人,那你就很容易将web编程放到手机上,轻松教你移植web应用游戏到Firefox手机应用再发布到 ...

  6. 为人们服务的asp.net 验证控件

    ASP.NET是微软推出的WEB开发工具,他有很强大的功能,今天看视频讲到验证控件这一部分,真的感受到了微软全心全意为人民服务了.越来越佩服微软了,人家都设计出来了,咱们一定要会用才可以啊,不然太…. ...

  7. hdu 3056 病毒侵袭持续中 AC自己主动机

    http://acm.hdu.edu.cn/showproblem.php?pid=3065 刘汝佳的模板真的非常好用,这道题直接过 学到: cnt数组记录单词出现次数 以及map存储单词编号与字符串 ...

  8. windows下体验Redis

    Redis 是一个高性能的key-value数据库, 使用内存作为主存储,数据访问速度非常快,当然它也提供了两种机制支持数据持久化存储.比较遗憾的是,Redis项目不直接支持Windows,Windo ...

  9. 常用aliyun公共资源列表

    公共DNS      223.5.5.5      223.6.6.6   源软件镜像站点      mirros.aliyun.com   NTP服务器 unix like      ntp1-7. ...

  10. 利用iptables实现基于端口的网络流量统计

    如何统计某个应用的网络流量(包括网络流入量和网络流出量)问题,可以转换成如何基于端口号进行网络流量统计的问题.大部分网络应用程序都是传输层及以上的协议,因此基于端口号(tcp, udp)统计网络流量基 ...