Достижение динамического ScrollView через обновление (или нет) фрагмента - PullRequest
0 голосов
/ 17 апреля 2019

Я хочу создать пользовательский интерфейс, в котором есть 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 Ответ

0 голосов
/ 23 апреля 2019

Спасибо @dotGitignore за предложение.Он предложил мне заглянуть в виджет андроида 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

...