我创建了一种联系人应用程序。我使用的是ListView和SimpleCursorAdapter,联系人存储在SQLite数据库中。
在主屏幕中,有两个按钮:“添加联系人”和“查看联系人”。当我查看联系人并单击其中一个时,我可以编辑或删除该联系人。
执行上述任何更改后,显示的联系人列表应根据所做的更改进行刷新,但不会。
我已阅读并尝试了大量可能的解决方案,但我发现的每个案例都不同,显然某些解决方案仅适用于某些情况,所以我很困惑。
在主要活动中,我称这种方法为:
public void viewContacts(View view){
Intent intent = new Intent(this, Contacts.class);
startActivity(intent);
}
这是Contacts类:
public class Contacts extends ExampleActivity {
ContactsOpenHelper dbHelper;
SQLiteDatabase db;
SimpleCursorAdapter adapter;
ListView listView;
Cursor c;
@Override
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.contactslayout);
listView = (ListView) findViewById(R.id.listView);
dbHelper = new ContactsOpenHelper(this);
db = dbHelper.getReadableDatabase();
String[] projection = {Contract.Entry.NAME,Contract.Entry.NUMBER,_ID};
c = db.query(Contract.Entry.TABLE_NAME, projection, null, null, null, null, null);
String[] fromColumns = {Contract.Entry.NAME,Contract.Entry.NUMBER};
int[] toViews = {R.id.textViewName, R.id.textViewNumber};
adapter = new SimpleCursorAdapter(this,R.layout.contactslayoutentry,c,fromColumns,toViews,0);
listView.setAdapter(adapter);
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
ContactDialog cd = new ContactDialog(db, id, adapter);
cd.show(getFragmentManager(), "Contactos");
}
});
}
}
ContactDialog类:
public class ContactDialog extends DialogFragment {
SQLiteDatabase db;
long id;
SimpleCursorAdapter adapter;
public ContactDialog(SQLiteDatabase db, long id, SimpleCursorAdapter adapter) {
this.db = db;
this.id = id;
this.adapter = adapter;
}
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
builder.setTitle("Choose an action")
.setPositiveButton("Edit", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
MyDialogFragment mdf = new MyDialogFragment(getActivity().getApplicationContext(), db, true, id);
mdf.show(getFragmentManager(), "TAG");
}
})
.setNegativeButton("Delete", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
String selection = Contract.Entry._ID + " LIKE ?";
String[] selectionArgs = {String.valueOf(id)};
db.delete(Contract.Entry.TABLE_NAME, selection, selectionArgs);
adapter.notifyDataSetChanged();
}
});
return builder.create();
}
}
在MyDialogFragment类中,我运行
行db.update(Contract.Entry.TABLE_NAME, myValues, Contract.Entry._ID + " LIKE " + id,null);
我不知道是否需要 notifySetDataChanged()方法,何时执行,或者是否需要其他解决方案。
我真的很感激一些帮助。
谢谢。
编辑:
我忘了指出在数据库中正确编辑或删除了元素。当我做一些更改时,我会回到主屏幕并再次单击“查看联系人”,并更新列表。我想这很重要。
答案 0 :(得分:0)
首先,我建议您使用CursorLoader和LoaderManager,它会比您当前的解决方案更好。
如果您仍想使用此解决方案,请在更新数据后添加cursor.requery(),如下所示:
db.update(Contract.Entry.TABLE_NAME, myValues, Contract.Entry._ID + " LIKE " + id,null);
adapter.getCursor().requery();