2014-05-09 142 views
0

我有一個問題。 我正在編寫一個應用程序來將記錄添加到內容提供者。 內容提供商工作正常。 我的問題是當我試圖插入一些數據到列表視圖。它插入,但我無法看到數據(除了我重新啓動應用程序)。 我從適配器調用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方法的實現?

問候

回答

0

需要調用restartLoader刷新列表視圖中的數據。

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

當您更改的ContentProvider數據

,你必須調用getLoaderManager().restartLoader()。它將放棄任何舊數據和onCreateLoader將會再次調用這將反過來獲取更新的記錄和ListView將被更新。

下面是關於Loaders的不錯教程。

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

+0

這是非常有用的Vipul也教程是偉大的。我添加了getLoaderManager()。restartLoader(0,null,MainActivity.this);爲對話框的按鈕和工作! – user3449953