【问题标题】:Android - How to refresh my listview after adding item to the database through a dialogfragmentAndroid - 如何通过对话框片段将项目添加到数据库后刷新我的列表视图
【发布时间】:2012-07-17 13:50:42
【问题描述】:

我有一个DialogFragment,我从那里将项目添加到数据库表中。

我还有另一个Fragment,它有一个ListView,我在其中显示数据库中的所有项目。 我可以将项目添加到数据库中,但它不会立即出现在 ListView 上,它正在从数据库中获取项目。

【问题讨论】:

  • 你能告诉我们你的MyListAdapter吗?

标签: android sql database


【解决方案1】:

你可以使用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 

【讨论】:

  • 我试过用这个,但它给出了一个错误,即 notifydatasetchanged is undefined 。我尝试在 onclick 后在 dialogfragment 类中使用它
  • 它是未定义的,因为您在不是您的 listAdpater 的实例上调用了它?你用的是哪个sdk版本???
  • 我用 satriano's 更新了代码,这与你的相似,但我的列表仍然没有刷新。我在正确的地方使用 notifydatasetchanged() 吗?
  • notifyDataSetChanged() 应该在 add :) 之后调用,所以刷新你称之为“my”的 List,然后调用方法 notifyDataSetChanged()
  • 我这样做了,但什么也没发生。如何在调用noifydatasetchanged()之前刷新列表
【解决方案2】:

从您的自定义适配器类创建一个全局对象。

MyListAdapter mAdapter = new MyListAdapter(getActivity(), my);

并设置你的 listView 的适配器:

mListView.setAdapter(mAdapter);

只需在适配器中刷新名为“my”的数组即可。 然后调用:

 mAdapter.notifyDataSetChanged();

它会做的伎俩...

【讨论】:

  • 适配器中的刷新数组,我不明白那部分?你能再解释一下吗?
  • 您的 listView 仅显示您将其发送到您的 arrayAdapter 的数组中的项目,在您的情况下这是“我的”...您只需要删除“我的”数组中的项目并添加新的,或者只是添加一个项目......任何你想要的。然后调用 notifyDataSetChanged,这样您的 arrayAdapter 就会知道列表项已更改...
【解决方案3】:

为您的 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() 一起调用它
【解决方案4】:

您必须再次将适配器设置为 listView 这将引发更新

yourAdapter.notifyDataSetChanged();
listView.setAdapter(yourAdapter);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-04-24
    • 1970-01-01
    • 2014-09-25
    • 1970-01-01
    • 2015-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多