Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/215.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android:ListFragment不刷新_Android_Android Fragments_Android Sqlite_Android Listfragment - Fatal编程技术网

Android:ListFragment不刷新

Android:ListFragment不刷新,android,android-fragments,android-sqlite,android-listfragment,Android,Android Fragments,Android Sqlite,Android Listfragment,您好,我正在使用一个ListFragment,从我的SQLite数据库中添加一个联系人。然后我想刷新ListFragment,但它不起作用 这是my Fragment中的代码,用于在单击ActionBar中的项目以向ListFragment添加联系人后显示AlertDialog: //Handle OnClick events on ActionBar items @Override public boolean onOptionsItemSelected(MenuItem item) {

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

这是my 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()方法中定义的适配器:

@覆盖
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
//显示操作栏项目
设置选项菜单(真);
//数据库
dbHandler=newdatabasehandler(getActivity());
//获取所有联系人
contacts=dbHandler.getAllContacts();
适配器=新的ArrayAdapter(getActivity(),
android.R.layout.simple\u list\u item\u activated\u 1,
android.R.id.text1,联系人);
adapter.setNotifyOnChange(true);
//显示ListFragment中的所有联系人
setListAdapter(适配器);
}

问题是什么?

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

你可以采取两种方法

  • 您可以将
    阵列适配器
    和设置代码替换为
    加载程序
    。最简单的方法是通过
    内容提供者
    访问数据库,这意味着您可以使用
    游标加载程序
    ,它将在数据库更改时更新适配器,即使更改来自
    服务
    或其他
    活动
    。您仍然可以使用
    加载器
    ,即使您不需要
    内容提供者的开销
    ,但是为您完成的工作会更少。无论哪种方式,
    Loader
    都可以让你在后台线程中执行加载,这样当你有很多联系人时,你就不会得到“app not response”。有关更多信息,请参阅

  • 对于这个问题,一个更快、短期的修复方法是在更新数据库的同时编辑您提供给适配器的数组。您可以通过更换线路来实现这一点

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

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


  • 非常感谢您的详细回答。我将尝试实现一个ContentProvider。在我看来,这是最好的解决办法。因为我以前从未使用过ContentProvider,所以实现它可能需要一些时间。
    dbHandler.addContact(new Contact(roomname, "0"));
    
    Contact newContact = new Contact(roomname, "0");
    dbHandler.addContact(newContact);
    contacts.add(newContact);