【问题标题】:ViewPager updates listView in fragment B from a fragment AViewPager 从片段 A 更新片段 B 中的 listView
【发布时间】:2012-07-31 20:36:57
【问题描述】:

我有一个带有两个片段的 ViewPager。在第一个上,有按钮(它是一个菜单),它们代表不同的类别。在第二个中,它是一个显示数据的 listView。 当用户单击其中一个菜单项时,我正在寻找一种方法来更改要在 listView 上显示的数据。 例如:用户点击菜单项1(fragment 1),fragment 2上的listView需要更新相应的数据。

我阅读了来自Google Android developer about fragments 的文档,但我无法解决,我没有找到解决问题的方法。

也许我错过了什么?

编辑:我试图通过使用 listItems.clear() 清除数据列表 (ArrayList> listItems) 来清除我的 ListView。没找到adapter.clear()怎么做,貌似Adapter类中不存在这个方法。

总结一下:我在包含 ListView (Fragment2) 的片段中创建了一个更新方法。我通过主要活动中的回调方法调用它,这部分似乎工作(我用调试模式检查了它)。 在我的 Fragment 2 的更新方法中,我使用 listItems.clear() 清除数据,然后执行 Fragment 的 OnActivityCreated()。其中,我的线程调用下载数据,然后在 OnPostExecute 中创建 ListView。

这是我的代码示例(片段2):

// After data are ready
lvListe = (ListView) getView().findViewById(R.id.lvListe);
lvListe.setSelected(true);
lvListe.setScrollingCacheEnabled(false);

adapter = new LazyAdapter(getActivity(),
getActivity().getBaseContext(), listItems,
     R.layout.affichageitem, new String[] { "image", "title",
                    "subtitle" }, new int[] { R.id.img_title,
                    R.id.titre_main, R.id.soustitre_main });

lvListe.setAdapter(adapter);
lvListe.setClickable(true);

lvListe.setOnItemClickListener(onItemClickListener);

// Update method :

public void update(String requete, String type)
{
    this.type = type;
    this.requete = requete;

    listItems.clear();
}

【问题讨论】:

  • @Maxetr 你能得到任何解决方案吗?

标签: android android-listview android-fragments android-viewpager


【解决方案1】:

我可能会这样做的方式是在托管ViewPagerActivity 中创建一个回调方法,并在第二个Fragment 中创建一个方法来更新数据。

那么你可以这样称呼它:

class Fragment1...
{
    ...
    callBackUpdate(data);
}

class Activity...
{
    ...
    public void callBackUpdate(String data)
    {
        Fragment2.update(data);
    }
}

class Fragment2...
{
    ...
    public void update(String data)
    {
        //do whatever
    }
}

开发者页面展示了如何创建Activity的回调方法。

edit:实际上这就是开发人员页面所说的方式。他们为回调创建接口OnArticleSelectedListener

编辑:我假设您正在将此库用于 LazyLoader:https://github.com/thest1/LazyList

如果是这样,那么您可以自己添加清除数据的方法。为此,请在 ListAdapter 中添加这样的方法:

public void clear()
{
    data = new String[](); //depends on what data is, if it's a List then just call                             data.clear() for example
    imageLoader=new ImageLoader(activity.getApplicationContext()); //clear the images
    notifyDataSetChanged(); //notify the adapter that the data has changed
}

这可能不完全符合你目前的想法,但你应该明白。

【讨论】:

  • 感谢您的帮助。正如您在答案中描述的那样,我在类中创建了方法 callBackUpdate 和 update 。当我单击菜单项然后单击 Fragment2 的更新功能但未再次创建 ListView 时,将调用 callBackUpdate 方法。我试图清除我的适配器使用的列表,然后用新数据填充它,但我根本不工作:(
  • @maxetx 您可以编辑您的帖子以显示您如何清除数据吗?通常只是<adapter>.clear(); <adapter>.notifyDataSetChanged()
  • 我编辑了我的第一篇文章,对我写的内容和代码示例进行了更多解释。
  • 谢谢,现在这部分工作了,但我仍然无法更新 ListView,我不知道为什么。适配器 = 新的 LazyAdapter(...);每次都被调用,并且 listItems 用新数据很好地完成了。适配器也更新了,但 ListView 没有显示在屏幕上。
  • 我发现了一个可能导致此问题的问题。事实上,当我调用 update 方法时,我给它 2 个参数供查询下载数据。在 Fragment2 的更新方法中,参数正常,但在 onActivityCreated() 覆盖方法中,参数为 Null(它们是我的类 Fragment2 的属性)。然后我尝试在 callBackUpdate 中使用:Fragment2.setArguments(bundle) 与 Bundle 中的两个参数,但我有以下异常:Fragment 已经处于活动状态。
【解决方案2】:

尝试在http://developer.android.com/reference/android/app/FragmentTransaction.html 使用称为 FragmentTransaction 管理器的工具

还有 FragmentManager http://developer.android.com/reference/android/app/FragmentManager.html

查看 stackoverflow 上与 FragmentManager 和 FragmentTransaction 相关的一些问题来解决这个问题。您需要做的就是将片段替换为由特定 xml 膨胀的新片段

【讨论】:

  • 我试过了: Fragment fragment = getFragmentManager().findFragmentById(R.id.viewpager); FragmentTransaction 事务 = getFragmentManager().beginTransaction(); transaction.replace(R.id.viewpager, new ListNewsFragment()); transaction.addToBackStack(null);事务.commit();但是当我返回时,我的 ListView 是空的。
  • 另外,如果我这样做,我想直接返回片段 B(listView 所在的位置): ViewPager vp = (ViewPager) getActivity().findViewById(R.id.viewpager); vp.setCurrentItem(1);片段 B 在数据(从 Internet)加载之前显示,因此 ListView 不会使用新数据更新并且屏幕保持黑色。
  • 这些行对我有用,你似乎对我做对了:FragmentTransaction ft=getSupportFragmentManager().beginTransaction(); mainMenu = new ListFragment(); ft.replace(R.id.mainView, mainMenu).addToBackStack(null).commit();
  • 我可以给出的基本解决方案是菜单上任何项目的 onclick 事件将片段 B 替换为您想要使用 FragmentTransaction 替换它的新片段,它应该可以正常工作。我目前正在使用选项卡并使用 FragmentTransaction 每当单击不同的选项卡时用不同的片段替换一个特定的片段
  • @Android2390 这是不正确的。你不应该直接从其他Fragments 操纵Fragments。它们应该通过Activity 进行操作(即按照文档中的描述实现回调事件)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多