我在删除项目后尝试刷新/更新列表视图。我无法弄清楚如何做到这一点,我想我应该使用notifyDataSetChanged();但不确定如何。有任何想法吗?感谢
heres是我的AndroidListViewCursorAdaptorActivity类:
public class AndroidListViewCursorAdaptorActivity extends Activity {
private ListView lv;
private DBAdapter dbHelper;
private SimpleCursorAdapter dataAdapter;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.workouts);
dbHelper = new DBAdapter(this);
dbHelper.open();
//Generate ListView from SQLite Database
displayListView();
ListView listView = (ListView) findViewById(R.id.listView1);
listView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
@Override
public boolean onItemLongClick(AdapterView<?> arg0, View arg1,
int pos, long id) {
Toast.makeText(getApplicationContext(),
"You have deleted a workout!", Toast.LENGTH_LONG).show();
Log.v("long clicked", "pos: " + pos);
dbHelper.deleteRow(id);
return true;
}
});
dataAdapter.notifyDataSetChanged();
}
private void displayListView() {
Cursor cursor = dbHelper.getAllRecords();
// The desired columns to be bound
String[] columns = new String[] {
DBAdapter.KEY_TITLE,
DBAdapter.KEY_WORKOUTDATE,
DBAdapter.KEY_EXERCISE_NOTES,
};
// the XML defined views which the data will be bound to
int[] to = new int[] {
R.id.title,
R.id.workoutDate,
R.id.workoutDetails,
};
// create the adapter using the cursor pointing to the desired data
//as well as the layout information
dataAdapter = new SimpleCursorAdapter(
this, R.layout.workout_info,
cursor,
columns,
to,
0);
ListView listView = (ListView) findViewById(R.id.listView1);
// Assign adapter to ListView
listView.setAdapter(dataAdapter);
}
}
这是我的DBAdapter类
public class DBAdapter {
public static final String KEY_ROWID = "_id";
public static final String KEY_TITLE = "title";
public static final String KEY_WORKOUTDATE = "workoutDate";
public static final String KEY_EXERCISE_NOTES = "notes";
private static final String TAG = "WorkoutDBAdapter";
private DatabaseHelper mDBHelper;
private SQLiteDatabase mdb;
private static final String DATABASE_NAME = "WorkoutDB";
private static final String DATABASE_TABLE = "workouts";
private static final int DATABASE_VERSION = 2;
private final Context mCtx;
private static final String DATABASE_CREATE =
"create table if not exists workouts " +
"(_id integer primary key autoincrement, " +
"title VARCHAR not null, " +
"workoutDate date, " +
"notes VARCHAR );";
private static class DatabaseHelper extends SQLiteOpenHelper {
DatabaseHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
Log.w(TAG, DATABASE_CREATE);
db.execSQL(DATABASE_CREATE);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
Log.w(TAG, "Upgrading database from version " + oldVersion + " to "
+ newVersion + ", which will destroy all old data");
db.execSQL("DROP TABLE IF EXISTS workouts");
onCreate(db);
}
}
public DBAdapter(Context ctx) {
this.mCtx = ctx;
}
public DBAdapter open() throws SQLException {
mDBHelper = new DatabaseHelper(mCtx);
mdb = mDBHelper.getWritableDatabase();
return this;
}
public void close() {
if (mDBHelper != null) {
mDBHelper.close();
}
}
//---insert a record into the database---
public long insertRecord(String title, String workoutdate, String notes) {
ContentValues initialValues = new ContentValues();
initialValues.put(KEY_TITLE, title);
initialValues.put(KEY_WORKOUTDATE, workoutdate);
initialValues.put(KEY_EXERCISE_NOTES, notes);
return mdb.insert(DATABASE_TABLE, null, initialValues);
}
//---retrieves all the records---
public Cursor getAllRecords() {
Cursor mCursor = mdb.query(DATABASE_TABLE, new String[]{KEY_ROWID, KEY_TITLE,
KEY_WORKOUTDATE, KEY_EXERCISE_NOTES}, null, null, null, null, null);
if (mCursor != null) {
mCursor.moveToFirst();
}
return mCursor;
}
public boolean deleteRow(long rowId) {
String where = KEY_ROWID + "=" + rowId;
return mdb.delete(DATABASE_TABLE, where, null) != 0;
}
}
答案 0 :(得分:1)
尝试
listView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
@Override
public boolean onItemLongClick(AdapterView<?> arg0, View arg1,
int pos, long id) {
Toast.makeText(getApplicationContext(),
"You have deleted a workout!", Toast.LENGTH_LONG).show();
Log.v("long clicked", "pos: " + pos);
dbHelper.deleteRow(id);
displayListView();
return true;
}
});
}
答案 1 :(得分:0)
有一些示例说明了当基础数据发生变化时如何“刷新”ListView
。在更改基础数据后调用adapter.notifyDataSetChanged();
。看看How to refresh dynamically listview after adding/deleting items from database。
您还可以查看所选答案here。