Вызов notifyDataSetChanged внутри onBindViewHolder - PullRequest
0 голосов
/ 24 февраля 2019

Я пытаюсь сделать notifyDataSetChanged внутри onBindViewHolder, как только сработал обратный вызов Пикассо, но у меня всегда есть эта ошибка

java.lang.IllegalStateException: Cannot call this method while RecyclerView is computing a layout

Причина, по которой мне нужно это сделать, заключается в том, что я использую StaggeredGridLayoutManagerтаким образом, представление переработчика должно быть переупорядочено после того, как Пикассо загрузил изображения с различными размерами

Мой фактический код:

@Override
public void onBindViewHolder(filmsAdapter.ViewHolder holder, int position) {


    FilmInfo filmInfo = filmsList.get(position);

    Picasso.get()
            .load(filmInfo.GetPreviewImageUrl())
            .placeholder(R.drawable.ic_launcher)
            .into(holder.getFilmItemIcon(), new Callback() {
                @Override
                public void onSuccess() {
                    notifyDataSetChanged();
                }

                @Override
                public void onError(Exception e) {

                }
            });

        holder.getItemContainer().setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Intent intent = new Intent(mContext, MainActivity.class);
            intent.putExtra("filmInfo", filmInfo);
            view.getContext().startActivity(intent);
        }
    });


}

1 Ответ

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

О проблеме вы можете использовать ReclyclerView.isComputingLayout (), чтобы проверять, когда RecyclerView все еще вычисляет макет.

Но, поскольку Picasso загружает изображения асинхронно, он создает бесконечный цикл.Когда триггеры Picasso.onSuccess notifyDataSetChanged будут вызываться снова onBindViewHolder и т. Д.

Единственное решение будет, если вы сможете отслеживать, сколько изображений должно быть загружено, или использовать семафор, если вы знаете, какмногие записи должны быть обработаны, но если количество элементов в списке не определено, это будет непросто, так как onBindViewHolder будет вызываться каждый раз, когда пользователь прокручивает RecyclerView.

Итак, общая проблема заключается в том, что Пикассо.onSuccess вызовет notifyDataSetChanged, а notifyDataSetChanged снова вызовет onBindViewHolder, который снова вызовет Пикассо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...