在 Viewpager 中更新 ListView
Posted
技术标签:
【中文标题】在 Viewpager 中更新 ListView【英文标题】:Update ListView in Viewpager 【发布时间】:2015-04-27 18:40:00 【问题描述】:请原谅我对 android 的无知。我只是在学习。我正在构建一个应用程序,它使用谷歌的 SlidingTabsColors 示例代码作为主布局(The developer website) .
我已经按照我希望的方式使用虚拟数据进行布局。这个想法是每个选项卡都将存储用户每轮的得分,然后在底部显示他们到目前为止的总得分。
知道什么在哪里很有帮助。 ListView
和TextView
在ViewPager
中,底部的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<int> playerScores);
现在在您的addRound()
方法中,确保片段不为空后,通过getScoreAdapter()
获取适配器的实例,然后在该实例上通过setDataset()
设置适配器的新数据集并通过证明新的数据集。最后,调用适配器的notifyDataSetChanged()
方法。
不用说,您的自定义 ArrayAdapter 应该包含它使用的数据集的一个实例,可以在构造函数中传递或使用我们的新方法 setDataset()
方法设置。
我提出建议的原因是我在您的代码中看到或没有看到;换句话说,我无法可靠地看到您的适配器如何接收更改的数据集;因此,我建议为适配器明确设置新数据集,确保适配器继续使用新设置的数据集并最终通知他们更改。希望这可以帮助。
【讨论】:
以上是关于在 Viewpager 中更新 ListView的主要内容,如果未能解决你的问题,请参考以下文章
在 TabLayout 和 ViewPager2 中执行异步任务后更新具有相同布局的多个片段
作为 ViewPager 的一部分更新 ListFragment 中的数据