在 Viewpager 中更新 ListView

Update ListView in Viewpager

原谅我Android的无知。我只是在学习。我正在构建一个应用程序,该应用程序使用 Google 的 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()方法中设置的)

感谢您抽空阅读!

贾斯汀

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

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

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

好的 Justinrixx,让我们尝试一些事情:

首先,让我们在 Fragment 中创建一个 public 方法,其中 returns ArrayAdapter 的实例,例如 getScoreAdapter().

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

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

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

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