Android/Java中RecyclerView结合Picasso加载图片无显示问题排查
咱们一步一步来拆解你的问题,帮你解决图片不显示的问题:
1) Picasso的使用是否正确?
你的Picasso调用存在两处需要修正的细节:
- 首先,你在
onBindViewHolder里错误地使用了Activity的全局列表imgURLS.get(position),但Adapter自身已经持有了列表logoList,应该改成logoList.get(position)才对——否则逻辑上会依赖外部变量,很容易出现数据不一致的问题。 - 其次,如果你使用的是Picasso 2.71828及之后的版本,
Picasso.with(context)已经被废弃,官方推荐使用Picasso.get()来获取实例,修正后的调用应该是:Picasso.get().load(logoList.get(position)).into(holder.logo);
2) 为什么图片无法显示?
这是核心问题,主要有两个关键原因:
原因一:Adapter初始化时列表为空,且异步任务完成后未通知更新
你在onCreate里先启动了异步任务URLcollector,然后立刻初始化Adapter并绑定到RecyclerView——但此时imgURLS还是空的(异步任务还在后台抓取数据,还没来得及填充列表)。Adapter拿到空列表,自然只会显示空白界面。
解决方法:
把Adapter设为Activity的成员变量,在异步任务完成后通知Adapter更新数据:
// 把Adapter改成MainActivity的全局成员 private MyAdapter adapter; @Override protected void onCreate(Bundle savedInstanceState) { setTheme(R.style.AppTheme); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); rvMain = findViewById(R.id.rvMain); rvMain.setLayoutManager(new GridLayoutManager(MainActivity.this, 2)); // 先初始化Adapter(此时imgURLS为空也没关系) adapter = new MyAdapter(imgURLS); rvMain.setAdapter(adapter); // 最后启动异步任务 new URLcollector().execute(); } // 修改你的URLcollector异步任务的onPostExecute方法 private class URLcollector extends AsyncTask<Void, Void, List<String>> { @Override protected List<String> doInBackground(Void... voids) { // 这里写你的Jsoup抓取图片URL的逻辑,返回填充好的列表 List<String> fetchedUrls = new ArrayList<>(); // ...你的抓取代码 return fetchedUrls; } @Override protected void onPostExecute(List<String> result) { super.onPostExecute(result); // 更新Activity的imgURLS列表 imgURLS.clear(); imgURLS.addAll(result); // 通知Adapter数据已更新,RecyclerView会重新加载 adapter.notifyDataSetChanged(); } }
原因二:缺少网络权限
别忘了在AndroidManifest.xml里添加网络权限,否则App无法访问网络加载图片:
<uses-permission android:name="android.permission.INTERNET" />
额外检查点
- 确认
imgURLS里的URL是有效的:把URL复制到浏览器里打开,看看能不能正常显示图片。 - 检查
recycler_item.xml里的ImageView宽高设置:如果是wrap_content,在图片加载完成前可能会显示空白,可以设置固定宽高或者match_parent(配合GridLayoutManager的列数)。 - 确认Picasso依赖已正确添加到
build.gradle(Module级别):implementation 'com.squareup.picasso:picasso:2.71828'
内容的提问来源于stack exchange,提问作者k copy k
相关产品推荐
相关产品推荐

