Android SimpleCursorAdapter 和 CursorLoader
Android SimpleCursorAdapter and CursorLoader
我有一个 android 列表布局。基本上它会在屏幕上列出用户的信息。请帮我解释一下listView是如何设置数据的。 SimpleCursorAdapter 如何与 Loader 链接
代码如下:
public class ChatList extends ListActivity implements LoaderManager.LoaderCallbacks<Cursor>{
private SimpleCursorAdapter adapter;
private final int Adapter_AccountName = 1;
@SuppressLint("NewApi")
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_chatlist);
adapter = new SimpleCursorAdapter(this,
R.layout.main_list_item,
null,
new String[]{DataProvider.COL_NAME, DataProvider.COL_COUNT,DataProvider.PROFILE_COL_LASTMSGAT,DataProvider.PROFILE_COL_IMAGE},
new int[]{R.id.text1, R.id.text2,R.id.text3,R.id.avatar},
0);
adapter.setViewBinder(new SimpleCursorAdapter.ViewBinder() {
@Override
public boolean setViewValue(View view, Cursor cursor, int columnIndex) {
switch(view.getId()) {
// here can add one more line in the main page for each account
case R.id.text2:
int count = cursor.getInt(columnIndex);
if (count > 0) {
((TextView)view).setText(String.format("%d new message%s", count, count==1 ? "" : "s"));
}
return true;
case R.id.text3:
String lastUpdate = cursor.getString(columnIndex);
Date d = DbDatetimeUtility.getDate(cursor.getString(columnIndex));
Date t = DbDatetimeUtility.getCurrentDate();
((TextView)view).setText(DbDatetimeUtility.returnDifferentTime(d,t));
return true;
case R.id.avatar:
byte[] imageByte = cursor.getBlob(columnIndex);
((ImageView)view).setImageBitmap(DbBitmapUtility.getResizedBitmap(DbBitmapUtility.getImage(imageByte),125,125));
return true;
}
return false;
}
});
ActionBar actionBar = getActionBar();
actionBar.setDisplayShowTitleEnabled(false);
//final ListView listView = getListView();
final ListView listView = getListView();
listView.setAdapter(adapter);
getLoaderManager().initLoader(0, null, this);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.action_settings:
Intent intent = new Intent(this, SettingsActivity.class);
startActivity(intent);
return true;
}
return super.onOptionsItemSelected(item);
}
@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
Intent intent = new Intent(this, ChatActivity.class);
intent.putExtra(Common.PROFILE_ID, String.valueOf(id));
startActivity(intent);
}
//----------------------------------------------------------------------------
@Override
public Loader<Cursor> onCreateLoader(int id, Bundle args) {
CursorLoader loader = new CursorLoader(this,
DataProvider.CONTENT_URI_PROFILE,
new String[]{DataProvider.COL_ID, DataProvider.COL_NAME, DataProvider.COL_COUNT,DataProvider.PROFILE_COL_LASTMSGAT,DataProvider.PROFILE_COL_IMAGE},
null,
null,//new String[]{DataProvider.PROFILE_COL_LASTMSGAT},
DataProvider.PROFILE_COL_LASTMSGAT + " DESC");
return loader;
}
@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
adapter.swapCursor(data);
}
@Override
public void onLoaderReset(Loader<Cursor> loader) {
adapter.swapCursor(null);
}
}
提前致谢!
暂时简单介绍一下,主要有以下几点:
onCreateLoader
从 SQLite 数据库中获取数据。
- 此代码
adapter = new SimpleCursorAdapter
填充适配器。
- 此代码
listView.setAdapter(adapter);
填充 ListView。
Using SimpleCursorAdapter to get Data from Database to ListView
上有一个很好的 Whosebug 答案
我有一个 android 列表布局。基本上它会在屏幕上列出用户的信息。请帮我解释一下listView是如何设置数据的。 SimpleCursorAdapter 如何与 Loader 链接
代码如下:
public class ChatList extends ListActivity implements LoaderManager.LoaderCallbacks<Cursor>{
private SimpleCursorAdapter adapter;
private final int Adapter_AccountName = 1;
@SuppressLint("NewApi")
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_chatlist);
adapter = new SimpleCursorAdapter(this,
R.layout.main_list_item,
null,
new String[]{DataProvider.COL_NAME, DataProvider.COL_COUNT,DataProvider.PROFILE_COL_LASTMSGAT,DataProvider.PROFILE_COL_IMAGE},
new int[]{R.id.text1, R.id.text2,R.id.text3,R.id.avatar},
0);
adapter.setViewBinder(new SimpleCursorAdapter.ViewBinder() {
@Override
public boolean setViewValue(View view, Cursor cursor, int columnIndex) {
switch(view.getId()) {
// here can add one more line in the main page for each account
case R.id.text2:
int count = cursor.getInt(columnIndex);
if (count > 0) {
((TextView)view).setText(String.format("%d new message%s", count, count==1 ? "" : "s"));
}
return true;
case R.id.text3:
String lastUpdate = cursor.getString(columnIndex);
Date d = DbDatetimeUtility.getDate(cursor.getString(columnIndex));
Date t = DbDatetimeUtility.getCurrentDate();
((TextView)view).setText(DbDatetimeUtility.returnDifferentTime(d,t));
return true;
case R.id.avatar:
byte[] imageByte = cursor.getBlob(columnIndex);
((ImageView)view).setImageBitmap(DbBitmapUtility.getResizedBitmap(DbBitmapUtility.getImage(imageByte),125,125));
return true;
}
return false;
}
});
ActionBar actionBar = getActionBar();
actionBar.setDisplayShowTitleEnabled(false);
//final ListView listView = getListView();
final ListView listView = getListView();
listView.setAdapter(adapter);
getLoaderManager().initLoader(0, null, this);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.action_settings:
Intent intent = new Intent(this, SettingsActivity.class);
startActivity(intent);
return true;
}
return super.onOptionsItemSelected(item);
}
@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
Intent intent = new Intent(this, ChatActivity.class);
intent.putExtra(Common.PROFILE_ID, String.valueOf(id));
startActivity(intent);
}
//----------------------------------------------------------------------------
@Override
public Loader<Cursor> onCreateLoader(int id, Bundle args) {
CursorLoader loader = new CursorLoader(this,
DataProvider.CONTENT_URI_PROFILE,
new String[]{DataProvider.COL_ID, DataProvider.COL_NAME, DataProvider.COL_COUNT,DataProvider.PROFILE_COL_LASTMSGAT,DataProvider.PROFILE_COL_IMAGE},
null,
null,//new String[]{DataProvider.PROFILE_COL_LASTMSGAT},
DataProvider.PROFILE_COL_LASTMSGAT + " DESC");
return loader;
}
@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
adapter.swapCursor(data);
}
@Override
public void onLoaderReset(Loader<Cursor> loader) {
adapter.swapCursor(null);
}
}
提前致谢!
暂时简单介绍一下,主要有以下几点:
onCreateLoader
从 SQLite 数据库中获取数据。- 此代码
adapter = new SimpleCursorAdapter
填充适配器。 - 此代码
listView.setAdapter(adapter);
填充 ListView。
Using SimpleCursorAdapter to get Data from Database to ListView
上有一个很好的 Whosebug 答案