具有定制布局的android CursorAdapter,以及如何使用它
Zas12357386
・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);
}
});
}