0

您好我正在使用ListFragment,其中我從我的SQLite數據庫添加聯繫人。然後我想刷新ListFragment,但它不起作用。Android:ListFragment不刷新

這是我的片段點擊一個項目ActionBar中後,以顯示AlertDialog添加一個接觸到ListFragment內的代碼:

//Handle OnClick events on ActionBar items 
@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    // handle item selection 
    switch (item.getItemId()) { 
     case R.id.menu_add: 
     Toast.makeText(getActivity(), "Click", Toast.LENGTH_SHORT).show(); 

     LayoutInflater factory = LayoutInflater.from(getActivity()); 

     //textEntryView is an Layout XML file containing text field to display in alert dialog 
     textEntryView = factory.inflate(R.layout.dialog_add_room, null);  

     //get the control from the layout  
     enter_room = (EditText) textEntryView.findViewById(R.id.enter_room); 

     //create Dialog 
     final AlertDialog.Builder alert1 = new AlertDialog.Builder(getActivity()); 
     //configure dialog 
     alert1.setTitle("Raum hinzufügen:").setView(textEntryView) 
     .setPositiveButton("Hinzufügen", 
       new DialogInterface.OnClickListener() { 
      public void onClick(DialogInterface dialog, 
        int whichButton) { 
       String roomname = enter_room.getText().toString(); 

       Log.d("Insert: ", "Inserting .."); 
       dbHandler.addContact(new Contact(roomname, "0")); 

       adapter.notifyDataSetChanged(); 
      } 
     }).setNegativeButton("Abbrechen", 
       new DialogInterface.OnClickListener() { 
      public void onClick(DialogInterface dialog, 
        int whichButton) { 
       //cancel dialog 
      } 
     }); 
     alert1.show();   
     return true; 
     default: 
     return super.onOptionsItemSelected(item); 
    } 
} 

的onCreate()方法內定義的適配器:

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    //display ActionBar items 
    setHasOptionsMenu(true); 

    //database 
    dbHandler = new DatabaseHandler(getActivity()); 

    //get all contacts 
    contacts = dbHandler.getAllContacts(); 

    adapter = new ArrayAdapter<Contact>(getActivity(), 
      android.R.layout.simple_list_item_activated_1, 
      android.R.id.text1, contacts); 

    adapter.setNotifyOnChange(true); 

    //show all contacts in the ListFragment 
    setListAdapter(adapter); 
} 

什麼問題?

回答

1

您的onCreate代碼使用您的DatabaseHandler類將所有聯繫人從數據庫加載到數組或List某種。稍後,您的點擊處理程序將另一個聯繫人添加到數據庫中:但它不會更改您的數組。 ArrayAdapter只知道你給它的數組,而不是數據庫,所以adapter.notifyDataSetChanged();沒有效果。

您可以採取兩種方法。

  1. 你可以用Loader替換您ArrayAdapter和設置代碼。最簡單的方法是通過ContentProvider訪問數據庫,這意味着您可以使用CursorLoader,它將在數據庫發生更改時處理更新適配器,即使更改來自Service或另一個Activity。即使您不需要ContentProvider的開銷,您仍然可以使用Loader,但這樣做的工作量較少。無論哪種方式,Loader都能爲您提供在後臺線程中執行加載的優勢,因此當您有大量聯繫人時,您不會收到「應用程序無響應」。有關更多信息,請參閱the loaders guide on Android Developers

  2. 解決此問題的更快,短期的解決方法是在更新數據庫的同時編輯給予適配器的數組。您也可以用

    Contact newContact = new Contact(roomname, "0"); 
    dbHandler.addContact(newContact); 
    contacts.add(newContact); 
    

    這種方式取代了線

    dbHandler.addContact(new Contact(roomname, "0")); 
    

    做到這一點,你必須做同樣的事情,當您更改或刪除聯繫人,如果不更新數據庫從您的ListFragment以外更改。你可能會發現你可以繼續添加這些額外的電話一段時間,但最終你會碰到一些操作,你必須以另一種方式來實現它。

+0

非常感謝您的詳細解答。我將嘗試實現一個ContentProvider。這看起來像是我眼中最好的解決方案。由於我從未使用ContentProvider,因此可能需要一些時間才能實現。 – 2013-03-24 08:30:41