0

我想创建一个 UI,其中有n大量的LinearLayout' 都包含在一个垂直中ScrollView(每行将包含几个项目)。

如果另一个片段更新一个值(通过 a 共享ViewModel),我还希望这个 ScrollView 更新。示例: ScrollView 最初呈现 4 个项目,后来用户在另一个片段中将值更改为 5。Observer 将通知我们的第一个片段,并添加第 5 个布局。

最好的方法是什么?我是否需要从根本上删除片段并强制刷新(使用新的布局数量来渲染)?或者有没有办法添加/删除这样的布局而无需刷新片段?

要考虑的其他注意事项:

  • 用户可以连续多次更改该值,所以我假设连续多次刷新可能会减慢应用程序的速度?在这种情况下,我可以一直等到用户完成并向后滑动(见下文)以更新片段 1 中的值。

  • 这两个片段也在选项卡视图中,因此一次只能看到一个片段。但是当他们再次滑入第一个选项卡时,这些更改需要出现。

片段1(到目前为止我的想法)

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    MyViewModel viewModel = ViewModelProviders.of(Objects.requireNonNull(getActivity())).get(MyViewModel.class);
    n = viewModel.getN().getValue();
    viewModel.getN().observe(this, this::updateN);
}

@Override
public void onViewCreated(@NonNull View view, Bundle savedInstanceState) {

    ScrollView scrollView = view.findViewById(R.id.scrollView);

    for (int i = 0; i < n; i++) {
        // For now, just show the index of the layout

        LinearLayout linearLayout = new LinearLayout(this.getContext());
        TextView textView = new TextView(this.getContext());
        textView.setText(String.format("%01d", i);

        linearLayout.setOrientation(LinearLayout.HORIZONTAL);
        linearLayout.addView(textView);
    }
}

private void updateN(int n) {
    this.n = n;

    // TODO: update UI here?
}
4

1 回答 1

0

感谢@dotGitignore 的建议。他建议我查看 android 小部件RecyclerView。这个小部件可以准确地完成我上面的意思:创建一个列表来响应和更新另一个片段中值的更改。

为此(下面链接的指南中的步骤):

  1. 将 RecyclerView 支持库添加到 gradle 构建文件

  2. 定义一个模型类以用作数据源。我使用一个ViewModel类进行片段到片段的访问。更多关于 ViewModel 的信息在这里

  3. 将 RecyclerView 添加到您的活动以显示项目

  4. 创建自定义行布局 XML 文件以可视化项目

  5. 创建一个 RecyclerView.Adapter 和 ViewHolder 来渲染项目

  6. 将适配器绑定到数据源以填充 RecyclerView

所有这些步骤也可以在以下优秀指南中找到: https ://guides.codepath.com/android/using-the-recyclerview

于 2019-04-22T22:13:37.790 回答