Не обновляется список RecyclerView после добавления элемента

182
12 декабря 2021, 15:00

В первом фрагменте заполняю List mItemList элементами из базы. Далее вывожу список элементов через RecyclerView на экране. Тут всё ок.

Вызываю второе активити с фрагментом через startActivityForResult() по нажатию на кнопку в первом фрагменте. Во втором фрагменте добавляю новый элемент в базу, устанавливаю результат и метод finish().

Далее в первом фрагменте получаю ответ в onActivityResult(), обновляю List mItemList (получаю новый список элементов), вызываю у адаптера RecyclerView метод .notifyDataSetChanged() но список на экране не обновляется.

    public class ItemListFragment extends Fragment {
    private List<Item> mItemList;
    private RecyclerView mRecyclerView;
    private ItemListAdapter mItemListAdapter;
    private FloatingActionButton mFab;
    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_item_list, container, false);
        mItemList = getItemList(); // Берет данные из базы
        mItemListAdapter = new ItemListAdapter(getContext(), mItemList);
        mRecyclerView = view.findViewById(R.id.recycler_view);
        mRecyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
        mRecyclerView.hasFixedSize();
        mRecyclerView.setAdapter(mItemListAdapter);
        mFab = view.findViewById(R.id.fab);
        mFab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                startActivityForResult(ItemAddActivity.newIntent(getActivity()), 6);
            }
        });
        return view;
    }
    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (requestCode == 6) {
            if (resultCode == getActivity().RESULT_OK) {
               mItemList = getItemList();
               // Проверяю что на самом деле List с item увеличился
               Log.d("MY_TEST", String.valueOf(mItemList.size()));
               // Обновляю адаптер, но список item'ов не обновляется на экране
                mItemListAdapter.notifyDataSetChanged();
            }
        }
    }
}
Answer 1

Проблема вот тут:

if (resultCode == getActivity().RESULT_OK) {
    mItemList = getItemList(); // <- issue
    // Проверяю что на самом деле List с item увеличился
    Log.d("MY_TEST", String.valueOf(mItemList.size()));
    // Обновляю адаптер, но список item'ов не обновляется на экране
    mItemListAdapter.notifyDataSetChanged();
}

список в адаптере не изменится, потому что mItemList теперь будет указывать на новый список. Чтобы список и в адаптере изменился, нужно не изменять ссылку mItemList, а изменить данные в ней:

if (resultCode == getActivity().RESULT_OK) {
    mItemList.clear();
    mItemList.addAll(getItemList());
    // Проверяю что на самом деле List с item увеличился
    Log.d("MY_TEST", String.valueOf(mItemList.size()));
    // Обновляю адаптер, но список item'ов не обновляется на экране
    mItemListAdapter.notifyDataSetChanged();
}
READ ALSO
Фильтрация по списку значений и фильтру на основе JpaSpecificationExecutor

Фильтрация по списку значений и фильтру на основе JpaSpecificationExecutor

Все это происходит в проекте на базе Spring Boot 2, DB - PostgreSQL

208
Шифрование Triple DES

Шифрование Triple DES

Есть ключ зашифрованный Triple DES на C# 16 байтНеобходимо расшифровать в коде написанном на Java, но Triple DES на java из документации следует:

241
Будильники на Spring

Будильники на Spring

У меня есть объекты рассылки, в которых есть параметр времениВ это время они должны быть отправлены на e-mail пользователям

146
Maven не видит класс из другого модуля

Maven не видит класс из другого модуля

При сборке проекта Maven выдает следующие ошибки:

246