在onBindViewHolder中调用notifyDataSetChanged

问题描述 投票:0回答:1

一旦picasso回调被触发,我试图在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);
        }
    });


}
android android-recyclerview picasso
1个回答
1
投票

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

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

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

因此,整体问题是Picasso.onSuccess将调用notifyDataSetChanged,而notifyDataSetChanged将再次调用onBindViewHolder,这将再次触发Picasso。

© www.soinside.com 2019 - 2024. All rights reserved.