Android:ListFragment不刷新

时间:2013-03-23 15:30:08

标签: android android-fragments android-sqlite android-listfragment

您正在使用ListFragment,我从我的SQLite数据库添加联系人。然后我想刷新ListFragment但它不起作用。

这是我的片段中的代码,用于在单击ActionBar中的项目以向ListFragment添加联系人后显示AlertDialog:

//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 个答案:

答案 0 :(得分:1)

您的onCreate代码使用您的DatabaseHandler类将数据库中的所有联系人加载到某个阵列或某种List中。稍后,您的单击处理程序会向数据库添加另一个联系人:但它不会更改您的阵列。 ArrayAdapter只知道你给它的数组而不是数据库,所以adapter.notifyDataSetChanged();没有效果。

您可以采取两种方法。

  1. 您可以使用ArrayAdapter替换Loader和设置代码。最简单的方法是通过ContentProvider访问您的数据库,这意味着您可以使用CursorLoader,它将在数据库更改时处理更新适配器,即使更改来自Service或其他Activity。即使您不想要Loader的开销,您仍然可以使用ContentProvider,但之后您的工作量就会减少。无论哪种方式,Loader都为您提供了在后台线程中执行加载的优势,因此当您有大量联系人时,您不会得到“应用程序无响应”。有关详细信息,请参阅the loaders guide on Android Developers

  2. 针对此问题的快速,短期修复是在更新数据库的同时编辑您为适配器提供的阵列。您可以通过替换

    行来完成此操作
    dbHandler.addContact(new Contact(roomname, "0"));
    

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

    这样,当您更改或删除联系人时,您必须执行类似的操作,如果您的数据库已从ListFragment外部更改,则不会更新。你可能会发现你可以暂时添加这些额外的电话,但最终你会遇到一些操作,你必须以另一种方式来使它工作。