Android:ListFragment不刷新
您好,我正在使用一个ListFragment,从我的SQLite数据库中添加一个联系人。然后我想刷新ListFragment,但它不起作用 这是my Fragment中的代码,用于在单击ActionBar中的项目以向ListFragment添加联系人后显示AlertDialog: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) {
//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);