如果lisetview的数据是从数据库读取,显示的数据比较复杂,而且对数据可以实时进行增删改查操作,一般不适用于使用CursorAdapter。可以使registerContentObserverUri监听数据库的变化来刷新列表,实例代码如下,可以添加和删除数据。
public class MainActivity extends Activity implements OnClickListener {
private ArrayList<DataModel> mDataList = new ArrayList<DataModel>();
private Adapter mAdapter;
static class DataModel {
private String mName;
private int mId;
private long mDate;
public String getName() {
return mName;
}
public int getId() {
return mId;
}
public long getDate() {
return mDate;
}
public static DataModel create(int id, String name, long date) {
DataModel model = new DataModel();
model.mId = id;
model.mName = name;
model.mDate = date;
return model;
}
}
/**数据监听*/
public ContentObserver mObserver = new ContentObserver(new Handler()) {
public void onChange(boolean selfChange) {
new LoadTask().execute();
};
};
private class Adapter extends BaseAdapter {
private LayoutInflater mInflater;
private ViewHolder mViewHolder;
public Adapter() {
mInflater = LayoutInflater.from(getApplicationContext());
}
@Override
public int getCount() {
return mDataList.size();
}
@Override
public Object getItem(int position) {
return mDataList.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
if (convertView == null) {
convertView = mInflater.inflate(R.layout.list_item, null, false);
mViewHolder = new ViewHolder(convertView);
convertView.setTag(mViewHolder);
} else {
mViewHolder = (ViewHolder) convertView.getTag();
}
final DataModel model = mDataList.get(position);
mViewHolder.nameView.setText(model.getName());
mViewHolder.delBtn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Uri delUri = Uri.withAppendedPath(DatabaseProvider.CONTENT_URI,
String.valueOf(model.getId()));
getContentResolver().delete(delUri, null, null);
}
});
return convertView;
}
class ViewHolder {
TextView nameView;
Button delBtn;
ViewHolder(View v) {
nameView = (TextView) v.findViewById(R.id.name);
delBtn = (Button) v.findViewById(R.id.delBtn);
}
}
}
class LoadTask extends AsyncTask<Void, Void, Void> {
@Override
protected void onPreExecute() {
mDataList.clear();
}
@Override
protected Void doInBackground(Void... params) {
String[] columns = {
BaseColumns._ID, DatabaseHelper.COLUMNS_NAME, DatabaseHelper.COLUMNS_DATE
};
String selection = null;
String[] selectionArgs = null;
String orderBy = DatabaseHelper.COLUMNS_DATE + " desc";
Cursor cursor = getContentResolver().query(DatabaseProvider.CONTENT_URI, columns,
selection, selectionArgs, orderBy);
if (cursor != null && cursor.moveToFirst()) {
do {
int id = cursor.getInt(0);
String name = cursor.getString(1);
long date = cursor.getLong(2);
mDataList.add(DataModel.create(id, name, date));
} while (cursor.moveToNext());
}
if (cursor != null) {
cursor.close();
}
return null;
}
@Override
protected void onPostExecute(Void result) {
mAdapter.notifyDataSetChanged();
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ListView listView = (ListView) findViewById(R.id.list);
findViewById(R.id.add).setOnClickListener(this);
mAdapter = new Adapter();
listView.setAdapter(mAdapter);
new LoadTask().execute();
}
@Override
protected void onResume() {
super.onResume();
getContentResolver() //注册监听
.registerContentObserver(DatabaseProvider.CONTENT_URI, true, mObserver);
}
@Override
protected void onPause() {
super.onPause();
getContentResolver().unregisterContentObserver(mObserver);//取消注册
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.add:
Random random = new Random();
Integer id = random.nextInt(1000);
ContentValues values = new ContentValues();
values.put(DatabaseHelper.COLUMNS_NAME, "lise:" + id);
values.put(DatabaseHelper.COLUMNS_DATE, System.currentTimeMillis());
getContentResolver().insert(DatabaseProvider.CONTENT_URI, values);
break;
}
}
}
监听数据库进行列表刷新的方式适用于以下情况:
1、该项数据的变化不依赖于该页面上的操作
因为如果该页面存在大量的数据,每次增加或删除数据都会导致数据的查询和UI的重绘,对页面的性能会有一定的影响
如果该数据不依赖于该页面上的操作,可以使用只刷新adapter的方式进行刷新,可以避免查询数据的操作,从而提高页面的响应速度,使用如下的方式进行操作:
public class MainActivity extends Activity implements OnClickListener {
private ArrayList<DataModel> mDataList = new ArrayList<DataModel>();
private Adapter mAdapter;
static class DataModel {
private String mName;
private int mId;
private long mDate;
public String getName() {
return mName;
}
public int getId() {
return mId;
}
public long getDate() {
return mDate;
}
public static DataModel create(int id, String name, long date) {
DataModel model = new DataModel();
model.mId = id;
model.mName = name;
model.mDate = date;
return model;
}
}
private class Adapter extends BaseAdapter {
private LayoutInflater mInflater;
private ViewHolder mViewHolder;
public Adapter() {
mInflater = LayoutInflater.from(getApplicationContext());
}
@Override
public int getCount() {
return mDataList.size();
}
@Override
public Object getItem(int position) {
return mDataList.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
if (convertView == null) {
convertView = mInflater.inflate(R.layout.list_item, null, false);
mViewHolder = new ViewHolder(convertView);
convertView.setTag(mViewHolder);
} else {
mViewHolder = (ViewHolder) convertView.getTag();
}
final DataModel model = mDataList.get(position);
mViewHolder.nameView.setText(model.getName());
mViewHolder.delBtn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Uri delUri = Uri.withAppendedPath(DatabaseProvider.CONTENT_URI,
String.valueOf(model.getId()));
getContentResolver().delete(delUri, null, null);
//只刷新adapter
mDataList.remove(position);
mAdapter.notifyDataSetChanged();
}
});
return convertView;
}
class ViewHolder {
TextView nameView;
Button delBtn;
ViewHolder(View v) {
nameView = (TextView) v.findViewById(R.id.name);
delBtn = (Button) v.findViewById(R.id.delBtn);
}
}
}
class LoadTask extends AsyncTask<Void, Void, Void> {
@Override
protected void onPreExecute() {
mDataList.clear();
}
@Override
protected Void doInBackground(Void... params) {
String[] columns = {
BaseColumns._ID, DatabaseHelper.COLUMNS_NAME, DatabaseHelper.COLUMNS_DATE
};
String selection = null;
String[] selectionArgs = null;
String orderBy = DatabaseHelper.COLUMNS_DATE + " desc";
Cursor cursor = getContentResolver().query(DatabaseProvider.CONTENT_URI, columns,
selection, selectionArgs, orderBy);
if (cursor != null && cursor.moveToFirst()) {
do {
int id = cursor.getInt(0);
String name = cursor.getString(1);
long date = cursor.getLong(2);
mDataList.add(DataModel.create(id, name, date));
} while (cursor.moveToNext());
}
if (cursor != null) {
cursor.close();
}
return null;
}
@Override
protected void onPostExecute(Void result) {
mAdapter.notifyDataSetChanged();
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ListView listView = (ListView) findViewById(R.id.list);
findViewById(R.id.add).setOnClickListener(this);
mAdapter = new Adapter();
listView.setAdapter(mAdapter);
new LoadTask().execute();
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.add:
Random random = new Random();
Integer id = random.nextInt(1000);
ContentValues values = new ContentValues();
String name = "lise:" + id;
long date = System.currentTimeMillis();
values.put(DatabaseHelper.COLUMNS_NAME, name);
values.put(DatabaseHelper.COLUMNS_DATE, date);
getContentResolver().insert(DatabaseProvider.CONTENT_URI, values);
//只刷新adapter
mDataList.add(DataModel.create(0, name, date));
mAdapter.notifyDataSetChanged();
break;
}
}
}