在上篇博客,Android-ListView-SimpleCursorAdapter,中介绍了SimpleCurosrAdapter的使用操作(SimpleCursorAdapter是简单便捷Cursor数据处理的适配器,内部都已经封装好了),而CursorAdapter是属于自定义适配器范畴,虽然没有SimpleCursorAdapter那么方便,但灵活性比SimpleCursorAdapter要灵活些
在上篇博客,Android-ListView-(BaseAdapter初步),Android-ListView-(BaseAdapter使用),中介绍了BaseAdapter的使用操作等(BaseAdapter是对很多数据类型进行适配),而CursorAdapter是专门给Cursor数据进行适配的
BaseAdapter是CursorAdapter的父类
BaseAdapter是SimpleCursorAdapter的父类
定义 MyCursorAdapter适配器
package liudeli.cp.client.adapter; import android.app.LoaderManager; import android.content.Context; import android.content.CursorLoader; import android.database.Cursor; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.CursorAdapter; import android.widget.TextView; import liudeli.cp.client.R; public class MyCursorAdapter extends CursorAdapter { // 定义布局加载器 private LayoutInflater layoutInflater; /** * 构造方法 * @param context 传入上下文 * @param c 传入Cursor游标 * @param flags 传入标记 */ public MyCursorAdapter(Context context, Cursor c, int flags) { /** * 主要把这些值传递给父类的构造方法,就会自动的传递到 newView(Context context, Cursor cursor, ViewGroup parent) * bindView(View view, Context context, Cursor cursor) */ super(context, c, flags); layoutInflater = LayoutInflater.from(context); } /** * Item布局文件的处理 * @param context 传入上下文 * @param cursor * @param parent * @return */ @Override public View newView(Context context, Cursor cursor, ViewGroup parent) { // Item布局文件,要显示的Item,在这里处理 View view = layoutInflater.inflate(R.layout.layout_item, null); return view; } /** * 把Cursor获取的数据和布局文件进行绑定 * @param view 此view 是上面 newView方法返回的View * @param context 上下文 * @param cursor 游标 */ @Override public void bindView(View view, Context context, Cursor cursor) { // 获取到布局的控件 TextView tvId = view.findViewById(R.id.tv_id); TextView tvName = view.findViewById(R.id.tv_name); TextView tvAge = view.findViewById(R.id.tv_age); // 获取Cursor里面的数据 int _id = cursor.getInt(cursor.getColumnIndex("_id")); String name = cursor.getString(cursor.getColumnIndex("name")); int age = cursor.getInt(cursor.getColumnIndex("age")); // 把数据绑定到控件里面去 tvId.setText(_id + ""); // setText(数据必须是字符串); tvName.setText(name); // setText(数据必须是字符串); tvAge.setText(age + ""); // setText(数据必须是字符串); } }
Java代码使用CursorAdapter适配器
/** * 查询 */ public void query(View view) { cursor = contentResolver.query(uri, new String[]{"_id", "name", "age"}, null, null , null, null); /** * 使用CursorAdapter 适配器 */ CursorAdapter adapter = new MyCursorAdapter(this, cursor, CursorAdapter.IGNORE_ITEM_VIEW_TYPE); // 给ListView设置适配器 listview.setAdapter(adapter); }
Item布局文件:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginBottom="8dp"> <TextView android:id="@+id/tv_id" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="20sp" android:text="id" android:textColor="@android:color/black" /> <TextView android:id="@+id/tv_name" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="20sp" android:text="name" android:textColor="@android:color/black" android:layout_marginTop="5dp" /> <TextView android:id="@+id/tv_age" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="20sp" android:text="age" android:textColor="@android:color/black" android:layout_marginTop="5dp" /> </LinearLayout>