Достижение динамического ScrollView через обновление (или нет) фрагмента
Я хочу создать пользовательский интерфейс, где есть 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?
}
1 ответ
Спасибо @dotGitignore за предложение. Он предложил мне заглянуть в виджет Android RecyclerView
, Этот виджет может точно выполнять то, что я имею в виду выше: создать список, который отвечает и обновляет изменения значения в другом фрагменте.
Для этого (шаги из руководства связаны ниже):
Добавить библиотеку поддержки RecyclerView в файл сборки Gradle
Определите класс модели для использования в качестве источника данных. Я использую
ViewModel
класс для доступа к фрагментам. Больше на ViewModel здесьДобавьте RecyclerView к своей деятельности, чтобы отобразить элементы
Создайте пользовательский XML-файл макета строки для визуализации элемента.
Создайте RecyclerView.Adapter и ViewHolder для визуализации элемента.
Свяжите адаптер с источником данных, чтобы заполнить RecyclerView
Все эти шаги также можно найти в следующем превосходном руководстве: https://guides.codepath.com/android/using-the-recyclerview