具有定制布局的android CursorAdapter,以及如何使用它

・4 分钟阅读

Android提供了专门用来显示来自SQLite数据库查询的数据的适配器类,有SimpleCursorAdapter类,很简单,但是你不能使用自己的定制xml布局,也不需要对布局进行控制,为了使用定制的xml布局,Android提供了CursorAdapter 。

一个 CursorAdapter使得当listview的资源来自数据库时,可以对数据值的绑定进行更多的控制,在newView()方法中,只需扩展视图,并且返回它,在bindView()方法中,设置视图的元素。

1:CursorAdapter

创建新类

首先,创建扩展CursorAdapter的新类,并给它命名。 这个新的CursorAdapter类必须实现继承的抽象方法,如下所示,

 

public class MyCursorAdapter extends CursorAdapter {

 //Default constructor
 public MyCursorAdapter(Context context, Cursor cursor, int flags) {
 . ..
 }

 public void bindView(View view, Context context, Cursor cursor) {
 . ..
 }

 public View newView(Context context, Cursor cursor, ViewGroup parent) {
 . ..
 return null;
 }
}

下一步定义MyCursorAdapter的方法

在BaseAdapter中,视图在getView方法中,但是,在CursorAdapter中,视图是在newView()方法中创建的,元素在bindView()中填充,在newView()方法中,只需扩展自定义xml的视图,并且返回它,在bindView()方法中,设置视图的元素,
下面是代码:

 

public class MyCursorAdapter extends CursorAdapter {
 private LayoutInflater cursorInflater;

 //Default constructor
 public MyCursorAdapter(Context context, Cursor cursor, int flags) {
 super(context, c, flags);
 cursorInflater = (LayoutInflater) context.getSystemService(
 Context.LAYOUT_INFLATER_SERVICE);
 . ..
 }

 public void bindView(View view, Context context, Cursor cursor) {
 TextView textViewTitle = (TextView) view.findViewById(R.id.articleTitle);
 String title = cursor.getString( cursor.getColumnIndex( MyTable.COLUMN_TITLE ) )
 textViewTitle.setText(title);
 . ..
 }

 public View newView(Context context, Cursor cursor, ViewGroup parent) {
 //R.layout.list_row is your xml layout for each row
 return cursorInflater.inflate(R.layout.list_row, parent, false);
 }
}

2)MainActivity类

主Activity设置

由于从数据库加载数据是繁重任务,我们将在线程中加载数据,如果你没有在它自己的线程中显式启动CursorAdapter,那么它会在主(用户界面)线程上运行,这里我们将使用android Handler

 

public class MainActivity extends Activity {
 MyCursorAdapter customAdapter;
 private Cursor mCursor;
 private ListView listView;

 //Default constructor
 public onCreate(Bundle savedInstanceState) {
 . ..
 listView = (ListView) findViewById(R.id.main_layout);

 //Your database schema
 String[] mProjection = { 
 MyTable.COLUMN_ID, 
 MyTable.COLUMN_TITLE,
 };

 //Here we query database
 mCursor = getContentResolver().query(
 MyAdContentProvider.CONTENT_URI,
 mProjection, 
 null, 
 null, 
 null);


 listView.setOnItemClickListener(new OnItemClickListener() {
 . ..
 }):
 }

 new Handler().post(new Runnable() {

 @Override
 public void run() {
 customAdapter = new MyCursorAdapter(
 MainActivity.this, 
 mCursor,
 0);

 listView.setAdapter(customAdapter);
 }

 });

}
Zas12357386 profile image