更改

时间:2015-11-04 11:59:10

标签: android listview refresh contacts simplecursoradapter

我创建了一种联系人应用程序。我使用的是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()方法,何时执行,或者是否需要其他解决方案。

我真的很感激一些帮助。

谢谢。

编辑:

我忘了指出在数据库中正确编辑或删除了元素。当我做一些更改时,我会回到主屏幕并再次单击“查看联系人”,并更新列表。我想这很重要。

1 个答案:

答案 0 :(得分:0)

首先,我建议您使用CursorLoaderLoaderManager,它会比您当前的解决方案更好。

如果您仍想使用此解决方案,请在更新数据后添加cursor.requery(),如下所示:

db.update(Contract.Entry.TABLE_NAME, myValues, Contract.Entry._ID + " LIKE " + id,null);
adapter.getCursor().requery();