当前位置: 首页 > 知识库问答 >
问题:

脱机时Recyclerview不调用CreateViewHolder

袁鸿畅
2023-03-14

当我的设备联机时,RecyclerView适配器会按预期工作。脱机时,不会调用onCreateViewHolder。

首先,我知道这一点:Recyclerview不会调用CreateViewHolder,这不是问题所在。getItemCount()返回一个数字

mAdapter = new MovieAdapter(this, this, movies, mScreenWidthPx, mIsFavorites);
    mMovieRecyclerView.setLayoutManager(new GridLayoutManager(this, numberOfColumns));
    mMovieRecyclerView.setAdapter(mAdapter);

所以,它似乎与在线/离线状态有关,但我无法弄清楚如何。这是适配器:

public class MovieAdapter extends RecyclerView.Adapter<MovieAdapter.ViewHolder> {

private static final String TAG = MovieAdapter.class.getSimpleName();

private ArrayList<Movie> mMovies;
private Context mContext;
private MovieClickListener mClickListener;
private int mScreenWidthPx;
private boolean mIsFavorite;

public interface MovieClickListener {
    void onMovieClick(Movie movie);
}

public MovieAdapter(Context context, MovieClickListener movieClickListener, ArrayList<Movie> movies, int screenWidthPx, boolean isFavorite) {
    Log.d(TAG,"creating MovieAdapter");
    this.mContext = context;
    this.mMovies = movies;
    this.mClickListener = movieClickListener;
    this.mScreenWidthPx = screenWidthPx;
    this.mIsFavorite = isFavorite;
    Log.d(TAG,"mMovies size constructor:" + mMovies.size());
}

@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    Log.d(TAG,"onCreateViewHolder");
    View view = LayoutInflater.from(mContext).inflate(R.layout.item_movie, parent, false);
    return new ViewHolder(view);
}

@Override
public void onBindViewHolder(ViewHolder holder, int position) {
    Log.d(TAG,"onBindViewHolder");
    if (mIsFavorite) {
        Log.d(TAG,"loading local image file");
        String fileName = ImageUtils.getMoviePosterFileName(mMovies.get(position).getTitle());
        File imageFile = ImageUtils.getImageFile(mContext,fileName);
        Picasso.with(mContext)
                .load(imageFile)
                .into(holder.mImagePoster);
    }
    else
        {
        Log.d(TAG,"loading remote image file");
        String posterUrl = NetworkUtils.buildMoviePosterUrl(mMovies.get(position).getPosterPath(), mScreenWidthPx);
        Picasso.with(mContext)
                .load(posterUrl)
                .into(holder.mImagePoster);
    }
}

@Override
public int getItemCount() {
    Log.d(TAG,"mMovies size getCount:" + mMovies.size());
    return mMovies.size();
}

public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
    @BindView(R.id.image_movie_poster) ImageView mImagePoster;

    ViewHolder(View itemView) {
        super(itemView);
        Log.d(TAG,"creating ViewHolder");
        ButterKnife.bind(this, itemView);
        itemView.setOnClickListener(this);
    }

    @Override
    public void onClick(View view) {
        int adapterPosition = getAdapterPosition();
        mClickListener.onMovieClick(mMovies.get(adapterPosition));
    }
}
}

共有2个答案

吕鸿文
2023-03-14

在离线模式下,毕加索图书馆无法下载图像,在这种情况下,图像结果将为空。您可能需要为毕加索设置网络策略,如下所示:-如果有网络或没有网络,请尝试先从缓存下载图像,如果失败,则从网络下载。以下是代码片段:-

Picasso.with(context)
                    .load(Uri.parse(getItem(position).getStoryBigThumbUrl()))
                    .networkPolicy(NetworkPolicy.OFFLINE)
                    .into(holder.storyBigThumb, new Callback() {
                        @Override
                        public void onSuccess() {

                        }

                        @Override
                        public void onError() {
                            // Try again online if cache failed
                            Picasso.with(context)
                                    .load(Uri.parse(getItem(position)
                                            .getStoryBigThumbUrl()))
                            .placeholder(R.drawable.user_placeholder)
                            .error(R.drawable.user_placeholder_error)
                                    .into(holder.storyBigThumb);
                        }
                    });
越麒
2023-03-14

这些都与网络无关,它告诉我,当您的网络状态发生变化时,您传入的名为电影的数组可能正在从另一个类中更改。祝你好运。

 类似资料:
  • 没有任何错误,所有数据似乎都有效。出于某种原因,正在调用与视图相关的其他方法。我已经确保了以下几点: > > 正在调用构造函数,成员变量有效。 父视图是垂直线性布局;没有scrollview,或任何其他具有自己滚动属性的视图。 包含片段的视图被创建并显示在屏幕上。 下面是片段中的声明,后跟适配器。任何帮助都将不胜感激,因为这完全令人困惑。

  • 问题内容: 我尝试了http://tour.golang.org/#1 这会产生错误: 这是否意味着我必须为Println加上“ fmt”软件包名称前缀?在其他语言中,这不是强制性的。 问题答案: 如果该函数不在当前程序包中,则必须为其添加前缀。 但是,您可以为此包创建一个别名: 或 “重命名” 功能: 或用作别名(可能是您最想要的): 请注意,在这种情况下,别名不是空白。根据Go 的规格: 合格

  • null 但是,我发现代理在重新连接时不会向客户机发送任何东西。 这就是我如何测试的:使用上面提到的四个参数将客户机连接到代理。用QOS=1订阅感兴趣的主题断开客户端 使用另一个客户端程序和另一个客户端id,连接到代理将消息发布到由现在脱机的客户端订阅的同一主题。请等待几秒钟,现在使用与以前相同的连接设置重新连接脱机客户端。

  • 我已经研究了这个问题的几个SO答案(这里、这里和这里),但没有一个提议的解决方案奏效。我的问题是我的RecyclView列表项没有显示。我在MessengerRecyclAdapter、onCreateViewHolder、onBindViewHolder和getItemCount中设置了断点,并且只调用了第一个。在断点中,我输入了表达式评估器并执行 并得到了预期的答案20。RecyclerVie

  • 我的不调用、甚至构造函数,因此中不显示任何内容。我放了日志进行调试,但没有显示日志。可能是什么问题? 我的适配器: 我的自定义行XML: 而我的片段:

  • 本文向大家介绍onNewIntent()调用时机?相关面试题,主要包含被问及onNewIntent()调用时机?时的应答技巧和注意事项,需要的朋友参考一下 singleTop:如果新Activity已经位于任务栈的栈顶,就不会重新创建,并回调 onNewIntent(intent) 方法。 singleTask:只要该Activity在一个任务栈中存在,都不会重新创建,并回调 onNewInten