我已经在网上浏览了 2 天,尝试了很多东西,但似乎无法弄清楚这有什么问题。
我对 Android 的开发还很陌生,所以我可能错过了一些明显的东西。
我有一个应用程序女巫正在使用 sqllite 数据库来存储一些数据,并为此概念证明在列表视图中显示它。我可以将项目添加到列表中,删除它们。
到目前为止,一切都很好。我遇到的问题是,当我没有删除更新数据库中名为“已删除”的列并将其设置为 1,然后让适配器更新列表时。它似乎不起作用。
如果我使用 delete 语句,它就可以工作。它更新了,一切都很好,但我想在数据库中有已删除的项目但不显示它们(所以基本上“隐藏”项目)
如果我检查数据库,更新本身成功了列更改和所有内容,所以我猜这是一个刷新问题,因为适配器不会重新查询数据库或那个方向的东西
列表视图加载器:
public void fillData() {
if(lw.getAdapter() == null){
// Fields from the database (projection)
// Must include the _id column for the adapter to work
String[] from = new String[] { TodoTable.COLUMN_SUMMARY, TodoTable.COLUMN_ID};
String where = TodoTable.COLUMN_DELETED + " = ?";
Cursor cursor = getContentResolver().query(TodoContentProvider.CONTENT_URI,from,where,new String[] {"0"},null);
// Fields on the UI to which we map
int[] to = new int[] { R.id.label };
adapter = new SimpleCursorAdapter(this, R.layout.todo_row, cursor, from,
to, 0);
Log.v("Count",Integer.toString(cursor.getCount()));
lw.setAdapter(adapter);
}
else
adapter.notifyDataSetChanged();
}
删除功能
@Override
public boolean onContextItemSelected(MenuItem item) {
switch (item.getItemId()) {
case DELETE_ID:
/* Code for actual delete
AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) item
.getMenuInfo();
Uri uri = Uri.parse(TodoContentProvider.CONTENT_URI + "/"
+ info.id);
getContentResolver().delete(uri, null, null);
fillData();
*/
/* Code for update and hide */
AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) item
.getMenuInfo();
Uri uri = Uri.parse(TodoContentProvider.CONTENT_URI + "/"
+ info.id);
ContentValues values = new ContentValues();
values.put(TodoTable.COLUMN_DIRTY, 1);
values.put(TodoTable.COLUMN_DELETED, 1);
getContentResolver().update(uri,values,null,null);
fillData();
return true;
}
return super.onContextItemSelected(item);
}
如果我将日志放到 ContentProvider 的查询函数中,它实际上不会触发。
关于如何解决这个问题的任何建议?
如果我使用adapter.swapCursor(cursor);
它工作正常只是不知道这是否是这样做的正确方法。
public void fillData() {
// Fields from the database (projection)
// Must include the _id column for the adapter to work
String[] from = new String[] { TodoTable.COLUMN_SUMMARY, TodoTable.COLUMN_ID};
String where = TodoTable.COLUMN_DELETED + " = ?";
Cursor cursor = getContentResolver().query(TodoContentProvider.CONTENT_URI,from,where,new String[] {"0"},null);
// Fields on the UI to which we map
int[] to = new int[] { R.id.label };
if(lw.getAdapter() == null){
adapter = new SimpleCursorAdapter(this, R.layout.todo_row, cursor, from,
to, 0);
Log.v("Count",Integer.toString(cursor.getCount()));
lw.setAdapter(adapter);
}
else
{
adapter.swapCursor(cursor);
}
}
泰来帮忙