Как обновить TextView при изменении в RecyclerView?

236
06 апреля 2018, 19:25

Есть активность CartActivity, в котором расположен RecyclerView. Так же есть класс RecyclerViewAdapter. Для ViewHolder прописан ClickListener, где пользователю отображается AlertDialog с предложением удалить выбранный элемент из списка.

CarActivity.java

...
 while (cursor.moveToNext()) {
                currentItem = new Item();
                currentItem.setId( cursor.getInt(idColumnIndex));
                currentItem.setName(cursor.getString(nameColumnIndex));
                currentItem.setPrice(Double.parseDouble(cursor.getString(priceColumnIndex)));
                currentItem.setAmount(Integer.parseInt(cursor.getString(amountColumnIndex)));
                currentItem.setImage(cursor.getString(imageColumnIndex));
                sumOrder += currentItem.getPrice()*currentItem.getAmount();
                items.add(currentItem);
            }
            mAdapter = new RecyclerViewAdapter(items, R.layout.row, this);
            mRecyclerView.setAdapter(mAdapter);
            progressBar.setVisibility(View.GONE);
            mSwipeRefreshLayout.setRefreshing(false);
            txtSumOrderView.setText(getString(R.string.txt_sum_order, sumOrder));
...

RecyclerViewAdapter.java

...
viewHolder.itemView.setOnClickListener(view -> {
alertDialog.setButton(AlertDialog.BUTTON_NEUTRAL, "OK",
                          (dialog, which) -> {
                                  items.remove(currentItem);
                                  notifyDataSetChanged();
                              }
                          });
                  alertDialog.show();
}
...

Как сказать активности, что списочный массив items с RecyclerView изменился, чтобы снова пересчитать общую сумму уже оставшихся позиций и обновить текст в элементе TextView у активности?

Answer 1

Ваша архитектура использует непродуктивное решение с копированием данных из базы в динамический список и помимо удаления из списка вам так же надо отдельно делать удаление из базы данных (первая часть ответа, решение для SimpleCursorAdapter виджета ListView, но сама проблема думаю понятна), что еще добавляет сумбура в реализацию.

Предлагаю вам обратить внимание на последние решения в организации архитектуры взаимодействия виджетов с данными, предложенную Google - Architecture Components (вторая часть ответа по ссылке выше). С появлением в библиотеке поддержки 27.1.0 класса адаптера для RecyclerView ListAdapter архитектура получила полный цикл взаимодействия и теперь любые операции с данными в БД автоматически отображаются на виджете, то есть теперь вам достаточно просто сделать записи, удаления, изменения в БД и они тут же будут отображены на экране.Естественно вам не понадобится никакое дублирование данных в списки, двойные операции по изменению данных и прочие ненужные проблемы.

Подробнее ознакомится с новой архитектурой можно по этой серии уроков

Так же стоит обратить внимание на то, что вычисления с данными в БД лучше доверить самой БД, а адаптеру только заниматься непосредственно выводом на экран, а не расчетами. В данном случае вы вычисляете значение sumOrder в адаптере, можно доверить это БД, используя вычисляемые столбцы. Например:

SELECT price, count, price*count AS sum  FROM  items

Здесь в выборке мы получим 3 столбца: значения из столбцов price, count и вычисляемый столбец sum (он будет добавлен в выборку, хотя в таблице и нет такого столбца), с произведением первых двух столбцов. Теперь можно просто брать оттуда данные с нужным результатом, а не считать их в адаптере.

READ ALSO
JavaFX FXML, для чего Controller?

JavaFX FXML, для чего Controller?

В уроках об FXML говорится об пользе и преимуществах разделения интерфейса и логики в программах, но есть ещё непонятный мне класс "Controller" (помимо...

216
Удалить папку с root правами

Удалить папку с root правами

Как удалить папку например /data/data/comandroid

218
Автоматизация запуска main метода

Автоматизация запуска main метода

Вопрос следующийЕсть некое приложение, в методе main оно выполняет действия, по ходу работы всю информацию логгирует и записывает в файл

163
Преобразовать в тип HashMap

Преобразовать в тип HashMap

Как возможно привести параметр RealmList к типу HashMap?

166