Android Listview和数据更新

Android Listview和数据更新,android,listview,loader,notifydatasetchanged,Android,Listview,Loader,Notifydatasetchanged,我有个问题。 我正在编写一个应用程序,向内容提供商添加记录。 内容提供商工作正常。 我的问题是当我试图将一些数据插入listview时。它插入,但我无法看到数据,除非我重新启动应用程序。 我正在从适配器调用notifydatasetchanged,但它不起作用 public class MainActivity extends Activity implements LoaderManager.LoaderCallbacks<Cursor> { ListVi

我有个问题。 我正在编写一个应用程序,向内容提供商添加记录。 内容提供商工作正常。 我的问题是当我试图将一些数据插入listview时。它插入,但我无法看到数据,除非我重新启动应用程序。 我正在从适配器调用notifydatasetchanged,但它不起作用

public class MainActivity extends Activity implements

    LoaderManager.LoaderCallbacks<Cursor> {
        ListView listContacts;
        ListView listView;
        Button addContactButton;
        MyAdapter adapter;
        ContentValues values;
        ContentResolver contentResolver;

        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            contentResolver = getContentResolver();
            listView = (ListView) findViewById(R.id.listView1);
            values = new ContentValues();
            getLoaderManager().initLoader(0, null, this);
            addContactButton = (Button) findViewById(R.id.button1);
            addContactButton.setOnClickListener(new OnClickListener() {
                @Override
                public void onClick(View v) {
                    final Dialog dialogForm = new Dialog(v.getContext());
                    dialogForm.setTitle("Add a new Address");
                    dialogForm.setContentView(R.layout.dialog);
                    dialogForm.show();
                    Button saveButton = (Button) dialogForm
                            .findViewById(R.id.saveButton);
                    final EditText addressEditText = (EditText) dialogForm
                            .findViewById(R.id.addressEditText);
                    saveButton.setOnClickListener(new OnClickListener() {
                        @Override
                        public void onClick(View v) {
                            try {
                                values.put(Contract.DATA, addressEditText.getText()
                                        .toString());
                                contentResolver.insert(
                                        Contract.CONTENT_URI, values);
                                values.clear();
                                dialogForm.dismiss();

                            } catch (Exception ex) {
                                ex.printStackTrace();
                            }
                        }
                    });
                    ((MyAdapter)listView.getAdapter()).notifyDataSetChanged() ;
                }

            });
        }

        @Override
        public Loader<Cursor> onCreateLoader(int arg0, Bundle arg1) {
            return new CursorLoader(this, Contract.CONTENT_URI, null, null, null,
                    null);
        }

        @Override
        public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) {
            adapter = new MyAdapter(this, R.layout.list_item, cursor, 0);
            listView.setAdapter(adapter);
            adapter.swapCursor(cursor);

        }

        @Override
        public void onLoaderReset(Loader<Cursor> loader) {
            adapter.swapCursor(null);

        }

    }
有人能给我一个关于这个问题的线索吗? 另外,我还有一个问题。onLoadFinished方法的实现是否高效

问候语

您需要调用restartLoader来刷新listview中的数据

当您更改ContentProvider数据时,必须调用getLoaderManager.restartLoader。它将丢弃任何旧数据,并再次调用onCreateLoader,后者将获取更新的记录,并更新ListView

下面是关于装载机的不错的教程


那是非常有用的Vipul,教程也很棒。我添加了getLoaderManager.restartLoader0,null,MainActivity.this;对于对话框的按钮,已成功!!