在 onBindViewHolder 中调用 notifyDataSetChanged

han0idx

一旦触发了毕加索回调,我正在尝试在 onBindViewHolder 中创建一个 notifyDataSetChanged 但我总是有这个错误

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

我需要这样做的原因是因为我使用的是 StaggeredGridLayoutManager 所以在毕加索加载不同大小的图像后需要重新排序 recyclerview

我的实际代码是:

@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);
        }
    });


}
佩拉科实验室

关于这个问题,您可以使用 ReclyclerView.isComputingLayout() 来检查 RecyclerView 何时仍在计算布局。

但是,由于 Picasso 异步加载图像,它会产生无限循环。当 Picasso.onSuccess 触发 notifyDataSetChanged 时,将再次调用 onBindViewHolder,依此类推。

唯一的解决方案是,如果您可以跟踪必须加载的图像数量或使用信号量(如果您知道必须处理多少个条目),但如果列表中的项目数量未定义,那么将不容易,因为每次用户滚动 RecyclerView 时都会调用 onBindViewHolder。

所以,总体问题是 Picasso.onSuccess 会调用 notifyDataSetChanged,而 notifyDataSetChanged 会再次调用 onBindViewHolder,这会再次触发 Picasso。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

notifyDataSetChanged()不调用onBindViewHolder()方法

每次调用notifyDataSetChanged()时,都会调用onBindViewHolder()

如何从AsyncTask中调用notifyDataSetChanged()

ExpandableListAdapter onClickListener,调用notifyDataSetChanged()

RecycleView 中的 onBindViewHolder 问题

Nested RecyclerView : onBindViewHolder 被无限调用

无法在CustomListAdapter上调用notifyDataSetChanged

在RecyclerView中,在OnBindViewHolder方法中

无法从ViewHolder(RecycleView)调用Adapter(onBindViewHolder)中的方法

尽管调用了OnBindViewHolder,RecyclewView Adapter中的项目仍未显示

如何完成OnBindViewHolder()中的活动

onBindViewHolder 中的 if-else 效率

我在AsyncTask中收到每个项目后,调用notifyDataSetChanged

在实现FastAndroidNetwork的lambda中的NotifyDataSetChanged

无法在Android中设置notifyDataSetChanged

RecyclerView onBindViewHolder一项被多次调用

回收者视图未调用onBindviewHolder

FirebaseRecyclerAdapter 的 onBindViewHolder 和 onCreateViewholder 没有被调用

Android:滚动时不会调用OnbindViewHolder

为什么在调用notifyDataSetChanged时发生NullPointerException?

检查对notifyDataSetChanged调用的onCheckedChanged方法

使用RecyclerView时,notifydatasetchanged调用onCreateViewHolder吗

调用arrayAdapter.notifyDataSetChanged()时,应用崩溃

调用notifyDataSetChanged()可以多次执行getView()

从不同的活动调用adapter.notifyDataSetChanged

即使调用notifyDataSetChanged()也未能更新ListView

Android中Adapter.onBindViewHolder中的IndexOutOfBoundsException

在Adapter.onBindViewHolder中获取CardView的宽度

与Android中的“ onBindViewHolder的工作”相混淆