在 Viewpager 中更新 ListView

Posted

技术标签:

【中文标题】在 Viewpager 中更新 ListView【英文标题】:Update ListView in Viewpager 【发布时间】:2015-04-27 18:40:00 【问题描述】:

请原谅我对 android 的无知。我只是在学习。我正在构建一个应用程序,它使用谷歌的 SlidingTabsColors 示例代码作为主布局(The developer website) .

我已经按照我希望的方式使用虚拟数据进行布局。这个想法是每个选项卡都将存储用户每轮的得分,然后在底部显示他们到目前为止的总得分。

知道什么在哪里很有帮助。 ListViewTextViewViewPager 中,底部的Button 是包含选项卡和ViewPager 的片段的一部分。目前,当按下按钮时,每个玩家的数据集都会添加一个新条目(ArrayList<Integer>') with the value of 0`。然后用户可以点击一个项目并对其进行编辑。

这就是有效的。但是ListView 不会更新,除非被告知。因此,当您单击按钮时,UI 不会发生任何变化,直到您滑动到下一个项目并且片段被刷新。所以一切都被正确添加了,我只是不知道如何告诉当前的ListView更新。

这是父片段中addRound() 方法的代码:

public void addRound() 
    // add a blank round for each player in their dataset
    for (int i = 0; i < mData.size(); i++) 
        mData.get(i).second.add(0);
    

    // get the pager adapter
    DefaultGameFragmentPagerAdapter adapter = (DefaultGameFragmentPagerAdapter) mViewPager.getAdapter();
    
    int pos = mViewPager.getCurrentItem();
    ContentFragment frag = (ContentFragment) adapter.getItem(pos);
    if (frag != null) 
        frag.update();
    

还有ContentFragment中的update()方法:

public void update() 
    mAdapter.notifyDataSetChanged();

当我尝试访问我的自定义 ArrayAdapter 时,我得到了一个 NullPointerException,但如果我从 ViewPager 获取当前片段,不应该初始化所有这些成员吗? (ListView是在onViewCreated()方法中设置的)

感谢您抽出宝贵时间阅读!

贾斯汀

【问题讨论】:

你好。我实际上希望看到更多代码,但让我们看看我是否可以提供帮助。 【参考方案1】:

ContentFragment frag = (ContentFragment) adapter.getItem(pos);

切勿使用适配器的getItem() 函数从 ViewPager 获取当前片段。它在内部调用以实例化片段,我们不应该显式调用它。通过调用getItem 返回的片段不是ViewPager 在该位置的实际片段。所以更新调用不会更新预期片段中的数据。

尝试使用this link 中讨论的方法之一。

【讨论】:

这不能回答@justinrixx 的问题。 调用 getItem 返回的 Fragment 并不是 ViewPager 中该位置的实际 Fragment。所以更新调用不会更新预期碎片网络中的数据。 现在这个评论无疑比你的第一个评论更像是一个解释性的答案 - 解释原因,而不是告诉什么。我赞成这个。 更新了答案:) 谢谢,我没有意识到不应该调用getItem。我有点想如果它是一种公共方法,那就可以使用了。 Bu 这解释了为什么我得到一个空指针。感谢您发布的链接,我最终使用片段管理器通过其标签获取片段,并且它有效。感谢您为我指明正确的方向!【参考方案2】:

好的 Justinrixx,让我们尝试几件事:

首先,让我们在 Fragment 中创建一个公共方法,该方法返回 ArrayAdapter 的实例,例如 getScoreAdapter()

其次,让我们在您的自定义 ArrayAdapter 中创建一个公共方法来(重新)设置数据集,例如setDataset(ArrayList&lt;int&gt; playerScores);

现在在您的addRound() 方法中,确保片段不为空后,通过getScoreAdapter() 获取适配器的实例,然后在该实例上通过setDataset() 设置适配器的新数据集并通过证明新的数据集。最后,调用适配器的notifyDataSetChanged() 方法。

不用说,您的自定义 ArrayAdapter 应该包含它使用的数据集的一个实例,可以在构造函数中传递或使用我们的新方法 setDataset() 方法设置。

我提出建议的原因是我在您的代码中看到或没有看到;换句话说,我无法可靠地看到您的适配器如何接收更改的数据集;因此,我建议为适配器明确设置新数据集,确保适配器继续使用新设置的数据集并最终通知他们更改。希望这可以帮助。

【讨论】:

以上是关于在 Viewpager 中更新 ListView的主要内容,如果未能解决你的问题,请参考以下文章

在 TabLayout 和 ViewPager2 中执行异步任务后更新具有相同布局的多个片段

如何更新 ViewPager 中选定项目的样式?

作为 ViewPager 的一部分更新 ListFragment 中的数据

ViewPager 未从代码、android、eclipse 更新

滑动时 ViewPager 更新片段

无法从 ViewPager 中的另一个片段刷新/更新片段中的列表视图