我想创建一个UI,其中n
数量的LinearLayout
都包含在垂直ScrollView
中(每行将包含几个项目)。
我还希望这个 ScrollView 在另一个片段更新值(通过ViewModel
共享)时更新。 示例:ScrollView 最初呈现 4 个项目,后来用户在另一个片段中将值更改为 5。 观察者将通知我们的第一个片段,并添加第 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?
}
感谢您@dotGitignore的建议。 他建议我查看安卓小部件RecyclerView
。 这个小部件可以很好地完成我上面的意思:创建一个列表,以响应和更新对另一个片段中值的更改。
为此(指南链接的波纹管中的步骤):
-
将回收商视图支持库添加到 gradle 构建文件
-
定义要用作数据源的模型类。 我使用
ViewModel
类进行片段到片段的访问。有关ViewModel的更多信息,请点击此处 -
将回收器视图添加到您的活动以显示项目
-
创建自定义行布局 XML 文件以可视化项目
-
创建 RecyclerView.Adapter 和 ViewHolder 以呈现该项
-
将适配器绑定到数据源以填充回收器视图
所有这些步骤也可以在以下优秀指南中找到: https://guides.codepath.com/android/using-the-recyclerview