关闭

Android CursorAdapter的使用

标签: androidadapterCursorAdapter适配器
341人阅读 评论(0) 收藏 举报
分类:

按照惯例,还是先从API介绍开始

public abstract class CursorAdapter extends BaseAdapter implements Filterable,
        CursorFilter.CursorFilterClient {}  继承于BaseAdapter是个虚类

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()重新查询以显示最新的数据。

公共方法:

继承自BaseAdapter 可实现其中存在的方法。

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

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

  参数

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

                   context          应用程序上下文

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

        

  public void changeCursor (Cursor cursor)

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

  参数                  

                   cursor               Cursor

  public CharSequence convertToString (Cursor cursor)

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

  参数        

                   cursor               cursor转换成CharSequence对象。

           返回值

             返回表示CharSequence的值。

 public Cursor getCursor ()

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

  返回值

            Cursor对象。

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线程)中运行。规定:当参数constraintnull或为空时,该方法返回原始结果。

        参数

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

  返回值

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

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

初始化相关参数

  protected void onContentChanged ()

      cursor对象上的ContentObserver接收到改变的通知时就会调用该方法,其默认实现提供了自动重新查询方式,但可以被子类重写。
其中必须实现newView和bindView。

newView该函数第一次回调用后,如果数据增加后也会再调用,但是重绘是不会调用的。
数据增加后,回调用该函数来生成与新增数据相对应的view。
bindView函数第一次回调用后,如果数据更新也会再调用,但重绘会再次调用的。
【总的来说应该是在调用bindView如果发现view为空会先调用newView来生成view】

接下里就是实例了,上代码!

首先是布局文件,activity_main.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <Spinner
        android:id="@+id/spinner1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true"
        android:layout_marginTop="15dp" />

    <ListView
        android:id="@+id/lvcsdn"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_below="@+id/spinner1"
        >
    </ListView>

</RelativeLayout>
然后是userlayout.xml

  <TextView
        android:id="@+id/tvusername"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="TextView"
        android:textSize="18sp" />

    <TextView
        android:id="@+id/tvuserage"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="TextView"
        android:textSize="18sp"  />
自定义adapter继承cursoradapter

package com.example.csdn;


import android.content.Context;
import android.database.Cursor;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.CursorAdapter;
import android.widget.TextView;

public class MyCursorAdapter extends CursorAdapter{


	public MyCursorAdapter(Context context, Cursor c, boolean autoRequery ){
		super(context, c, autoRequery);
	}
	@Override
	public CharSequence convertToString(Cursor cursor)
	{
		return cursor == null ? "" : cursor.getString(cursor
				.getColumnIndex("_id"));
	}
	@Override
	public View newView(Context context, Cursor cursor, ViewGroup parent) {
		ViewHolder holder = new ViewHolder();
		View inflate = LayoutInflater.from(context).inflate(R.layout.userlayout, null);
		holder.tvname = (TextView) inflate.findViewById(R.id.tvusername);
		holder.tvage = (TextView) inflate.findViewById(R.id.tvuserage);
		inflate.setTag(holder);
		return inflate;//返回的view传给bindView。
	}

	@Override
	public void bindView(View view, Context context, Cursor cursor) {
		ViewHolder holder = (ViewHolder) view.getTag();
		String name = cursor.getString(cursor.getColumnIndex("name"));
		int age = cursor.getInt(cursor.getColumnIndex("age"));
		System.out.println(name);
		holder.tvname.setText(name);
		holder.tvage.setText(String.valueOf(age));
	}
	class ViewHolder{
		private TextView tvname;
		private TextView tvage;
	}
}
最后是activity
public class CursorAdapterActivity extends Activity{
	MySQLiteHelper myHelper;
	private ListView lv;
	MyCursorAdapter adapter;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		lv=(ListView) findViewById(R.id.lvcsdn);
		//先像数据库插入数据
		//创建MySQLiteOpenHelper辅助类对象  
		myHelper = new MySQLiteHelper(this, "my.db", null, 1); 
		//获取数据库对象  
		SQLiteDatabase db = myHelper.getWritableDatabase();  
		//使用execSQL方法向表中插入数据  
		db.execSQL("insert into user(name,age) values('zhangsan',18)");  
		db.execSQL("insert into user(name,age) values('lisi',20)");  
		//使用insert方法向表中插入数据  
		ContentValues values = new ContentValues();  
		values.put("name", "wangwu");  
		values.put("age", 22);  
		//调用方法插入数据  
		db.insert("user",null, values);  
		db.close();
		 //获得数据库对象  
        SQLiteDatabase db2 = myHelper.getReadableDatabase();  
        //查询表中的数据  
        Cursor cursor = db2.query("user", null, null, null, null, null,null); 
        adapter=new MyCursorAdapter(this, cursor,true);
        lv.setAdapter(adapter);
//        cursor.close();//关闭结果集  
        db.close();//关闭数据库对象  
	}
}
这里用到了SQLiteOpenHelper这里就不多做介绍了,就是对数据库的一些操作

public class MySQLiteHelper extends SQLiteOpenHelper{

	public MySQLiteHelper(Context context, String name, CursorFactory factory,
			int version) {
		super(context, name, factory, version);
	}
	//创建表
	@Override
	public void onCreate(SQLiteDatabase db) {
		db.execSQL("create table if not exists user (_id integer primary key autoincrement,name varchar(20) ,age integer)");
	}

	@Override
	public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
		
	}

}
效果图:

好了,cursorAdapter就介绍到这里。有什么不好的地方欢迎指正。





 


0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:14846次
    • 积分:285
    • 等级:
    • 排名:千里之外
    • 原创:12篇
    • 转载:5篇
    • 译文:0篇
    • 评论:10条
    文章分类
    文章存档
    最新评论