Я хочу создать пользовательский интерфейс, в котором есть n
количество LinearLayout
, содержащихся в вертикальной ScrollView
(каждая строка будет содержать пару элементов).
Я также хочу, чтобы этот ScrollView обновлялся, если другой фрагмент обновляет значение (используется через ViewModel
). Пример: ScrollView изначально визуализируется с 4 элементами, а затем пользователь меняет значение на 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?
}