【发布时间】:2012-07-17 13:50:42
【问题描述】:
我有一个DialogFragment,我从那里将项目添加到数据库表中。
我还有另一个Fragment,它有一个ListView,我在其中显示数据库中的所有项目。
我可以将项目添加到数据库中,但它不会立即出现在 ListView 上,它正在从数据库中获取项目。
【问题讨论】:
-
你能告诉我们你的
MyListAdapter吗?
我有一个DialogFragment,我从那里将项目添加到数据库表中。
我还有另一个Fragment,它有一个ListView,我在其中显示数据库中的所有项目。
我可以将项目添加到数据库中,但它不会立即出现在 ListView 上,它正在从数据库中获取项目。
【问题讨论】:
MyListAdapter吗?
你可以使用yourListAdapter.notifyDataSetChanged()的方法,见this
编辑:
您从片段 A 将项目添加到数据库中,因此您应该在片段 B 中为您的 listAdapter 创建一个全局变量(包含listView 的那个),并通过标签在片段 A 中获取您的片段,并且那么你应该打电话:
//when you add the fragmentB to your Activity , make sure you set a Tag for it
FragmentB f = (FragmentB) getActivity().getSupportFragmentManager()
.findFragmentByTag(TAG_FRAGMENT_B);
f.getMyListAdapter().notifyDataSetChanged();
编辑 2:
在您的 CustomListAdapter 中,添加一个方法来刷新您的对象列表 (my):
public void setMyList(List myListOfObjects) {
this.my = myListOfObjects;
this.notifyDataSetChanged();
}
然后,当您将新对象添加到数据库时,从数据库中检索所有数据,然后调用:
f.getMyListAdapter().setMyList(newListOfObjects);//newListOFObjects contains the new data
【讨论】:
从您的自定义适配器类创建一个全局对象。
MyListAdapter mAdapter = new MyListAdapter(getActivity(), my);
并设置你的 listView 的适配器:
mListView.setAdapter(mAdapter);
只需在适配器中刷新名为“my”的数组即可。 然后调用:
mAdapter.notifyDataSetChanged();
它会做的伎俩...
【讨论】:
为您的 MyListAdapter 创建一个全局变量
MyListAdapter adapter;
...
adapter = new MyListAdapter(getActivity(), my);
在它存在的片段中创建一个getter:
public MyListAdapter getAdapter() {
return adapter;
}
当你在数据库中创建一个新条目时,调用这个:
//Make sure you make a tag when you add your fragment
MyFrag f = (MyFrag) getActivity().getSupportFragmentManager()
.findFragmentByTag(YOURTAGHERE);
f.getAdapter().notifyDataSetChanged();
这应该可行,但您需要自己进行一些调试/逻辑才能完成。
编辑:方法如下:
public void updateList() {
List<MyItem> l = db.getAllMyItem();
for(MyItem cn :l )
{
cn = l.get(0);
l.remove(0);
my.add(new MyList(cn.getName(),0));
}
}
【讨论】:
List。创建一个执行此操作的公共方法并与notifyDataSetChanged() 一起调用它
您必须再次将适配器设置为 listView 这将引发更新
yourAdapter.notifyDataSetChanged();
listView.setAdapter(yourAdapter);
【讨论】: