Android 从URL加载图像的适配器未得到更新
我在更改时更新Android 从URL加载图像的适配器未得到更新,android,picasso,android-viewholder,Android,Picasso,Android Viewholder,我在更改时更新RecylcerView.Adapter中的图像时遇到问题。我正在为我的适配器设置此类: public class ShowMembersAdapter extends RecyclerView.Adapter<ShowMembersAdapter.ViewHolder> { private ArrayList<User> users; private Context context; private ShowTeamsAdapter
RecylcerView.Adapter
中的图像时遇到问题。我正在为我的适配器设置此类:
public class ShowMembersAdapter extends RecyclerView.Adapter<ShowMembersAdapter.ViewHolder> {
private ArrayList<User> users;
private Context context;
private ShowTeamsAdapter.OnItemClickListener mListener;
public void setOnItemClickListener(ShowTeamsAdapter.OnItemClickListener listener) {
mListener = listener;
}
public static class ViewHolder extends RecyclerView.ViewHolder {
private CircleImageView mImage;
public ViewHolder(View itemView, ShowTeamsAdapter.OnItemClickListener listener) {
super(itemView);
mImage = itemView.findViewById(R.id.image);
itemView.setOnClickListener(view -> {
if (listener != null) {
int position = getAdapterPosition();
if (position != RecyclerView.NO_POSITION) {
listener.onItemClick(position);
}
}
});
}
}
public ShowMembersAdapter(ArrayList<User> users, Context context) {
this.users = users;
this.context = context;
}
@NonNull
@Override
public ShowMembersAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.layout_member_item, parent, false);
ShowMembersAdapter.ViewHolder viewHolder = new ShowMembersAdapter.ViewHolder(v, mListener);
return viewHolder;
}
@Override
public void onBindViewHolder(@NonNull ShowMembers
String imageUrl = "MYURL" + users.get(position).getEmail() + ".jpg";
Picasso.get().load(imageUrl).resize(200,200).error(R.mipmap.ic_team_member_no_photo).into(holder.mImage);
}
@Override
public int getItemCount() {
return users.size();
}
}
public类ShowMembersAdapter扩展了RecyclerView.Adapter{
私有ArrayList用户;
私人语境;
私人ShowTeamsAdapter.OnItemClickListener mListener;
public void setOnItemClickListener(ShowTeamsAdapter.OnItemClickListener侦听器){
mListener=监听器;
}
公共静态类ViewHolder扩展了RecyclerView.ViewHolder{
私人CircleImageView mImage;
公共视图持有者(视图项视图,ShowTeamsAdapter.OnItemClickListener侦听器){
超级(项目视图);
mImage=itemView.findviewbyd(R.id.image);
itemView.setOnClickListener(视图->{
if(侦听器!=null){
int position=getAdapterPosition();
如果(位置!=RecyclerView.无位置){
listener.onItemClick(位置);
}
}
});
}
}
public ShowMembersAdapter(ArrayList用户、上下文){
this.users=用户;
this.context=上下文;
}
@非空
@凌驾
public ShowMembersAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup父级,int-viewType){
视图v=LayoutInflater.from(parent.getContext()).flate(R.layout.layout_成员_项,parent,false);
ShowMembersAdapter.ViewHolder ViewHolder=新ShowMembersAdapter.ViewHolder(v,mListener);
返回视图持有者;
}
@凌驾
public void onBindViewHolder(@NonNull ShowMembers)
字符串imageUrl=“MYURL”+users.get(position).getEmail()+“.jpg”;
Picasso.get().load(imageUrl).resize(200200).error(R.mipmap.ic\u team\u member\u no\u photo).into(holder.mImage);
}
@凌驾
public int getItemCount(){
返回users.size();
}
}
我是从我的片段
填充这个类的。当我启动一个应用程序时,它工作得非常好。但是,每当我从应用程序更新图片时,我猜适配器不会改变,因为图像URL仍然是一样的。你有什么其他想法吗?我可以这样做吗?你认为我应该再调用一个截取请求来获取图像吗并将它们保存到每个用户,这样我就不会直接从适配器调用它们了
感谢您的帮助!更新图片后,您是否尝试过以下方法:
yourAdapter.notifyDataSetChanged()
毕加索会将您的图像缓存到本地存储中以提高加载速度。在您的情况下,图像URL不会更改,因此它不知道必须再次从URL获取图像。您必须清除缓存。谢谢!但是,只有当我调用此方法毕加索工具.clearCache(Picasso.get())时,它才起作用在显示用户详细信息的活动中。在我显示许多用户的片段中,我不知道在哪里调用clearCache()
。因为当我把它放在适配器中时,我猜在第一次运行之后,onBindViewHolder就不再被调用了……在现实世界中,存储和内存中的缓存是提高图像加载速度的好方法。你不必担心相同的图像URL,但不同的图像内容。如果你想让毕加索每次都从URL获取,他们提供了skipMemoryCache
,MemoryPolicy
与无缓存
和无存储
。您可以从毕加索文档中获得更多信息: