列表视图和数据更新

时间:2014-05-09 05:31:11

标签: android listview loader notifydatasetchanged

我有一个问题。 我正在编写一个应用程序来向Content Provider添加记录。 内容提供商工作得很好。 我的问题是当我尝试将一些数据插入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方法?

问候

1 个答案:

答案 0 :(得分:0)

您需要调用restartLoader来刷新列表视图中的数据。

http://developer.android.com/reference/android/app/LoaderManager.html

当您对ContentProvider数据进行更改时,您必须调用getLoaderManager().restartLoader()。它将丢弃所有旧数据,并且将再次调用onCreateLoader,这将反过来获取更新的记录,并且ListView将被更新。< / p>

以下是关于装载机的精彩教程。

http://www.grokkingandroid.com/using-loaders-in-android/