繁体   English   中英

在Viewpager中更新ListView

[英]Update ListView in Viewpager

原谅我对Android的无知。 我只是在学习。 我正在构建一个使用Google的SlidingTabsColors示例代码作为主要布局的应用程序(开发者网站)

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

屏幕截图

知道哪里有帮助。 ListViewTextViewViewPager ,底部的Button是包含选项卡和ViewPager的片段的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();
    }
}

还有ContentFragmentupdate()方法:

public void update() {
    mAdapter.notifyDataSetChanged();
}

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

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

贾斯汀

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

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

尝试使用此链接中讨论的方法之一。

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

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

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

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

不用说,您的自定义ArrayAdapter应该保存它使用的数据集的一个实例,该实例可以传入构造函数中,也可以使用我们的新方法setDataset()方法进行设置。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM