0

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

这是我的 Fragment 中的代码,用于在单击 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);
}

问题是什么?

4

1 回答 1

1

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

您可以采取两种方法。

  1. 您可以将您的ArrayAdapter和设置代码替换为Loader. 最简单的方法是通过 a 访问您的数据库ContentProvider,这意味着您可以使用 aCursorLoader并且它会在数据库更改时更新您的适配器,即使更改来自 aService或另一个ActivityLoader即使您不想要 a 的开销,您仍然可以使用 a ContentProvider,但是为您完成的工作更少。无论哪种方式,aLoader都为您提供了在后台线程中执行加载的优势,因此当您有很多联系人时,您不会得到“应用程序无响应”。有关更多信息,请参阅Android 开发人员上的加载程序指南。

  2. 一个更快、更短期的解决方法是在更新数据库的同时编辑您提供给适配器的数组。你可以通过替换线来做到这一点

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

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

    这样,当您更改或删除联系人时,您必须执行类似的操作,并且如果您的数据库从您的外部更改,它将不会更新ListFragment。您可能会发现您可以继续添加这些额外的调用一段时间,但最终您会遇到一些操作,您必须以其他方式进行操作才能使其工作。

于 2013-03-23T19:47:24.950 回答