Почему RecyclerView обновляется без notifyDataSetChanged ()? - PullRequest
0 голосов
/ 23 февраля 2019

Общеизвестно вызывать notifyDataSetChanged() или notifyItemChanged(), когда вы изменяете массив, который обрабатывается адаптером RecyclerView, чтобы обновить представление и отразить сделанные изменения.Но я запустил пример приложения, в котором ни один из них не вызывается, когда я добавляю элементы в массив сразу после вызова .setAdapter() в том же блоке, и представление обновляется!Такое поведение не происходит, когда я пытаюсь добавить элементы с помощью кнопки onClickListener или из фонового потока (оба требуют notifyDataSetChanged для обновления представления).

Что здесь происходит?Разве для добавления элементов в список сразу после вызова .setAdapter() в том же блоке не требуется что-то вроде notifyDataSetChanged()?

т.е.

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        ...

        myList.add("a");
        myList.add("b");
        recyclerView.setAdapter(adapter);
        myList.add("c"); // the recyclerView is updating and shows "c" here! why???

        findViewById(R.id.fab).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                myList.add("e"); // the recyclerView will NOT update here unless you call `notifyDataSetChanged`
            }
        });

        ...

1 Ответ

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

Если вы передаете ArrayList в Adapter и добавляете элементы в onCreate, это было бы до того, как приложение нарисовало ваш первый кадр.

Существуетмомент, когда вы можете добавлять элементы, потому что адаптер не выложил элементы.

А внутри вашего onClick это будет после того, как onCreate закончится, что означает adapterуже выложен.

Вы можете попробовать переместить add("c"); в onPostCreate или onResume, и вы можете увидеть результат, аналогичный вашему onClick.

...