Android 通过加载图像创建RecyclerView的正确方法是什么?
我正在尝试创建一个包含从服务器下载图像的片段的RecyclerView,但我遇到了一些问题: 当滚动到快速,你可以看到以前的图片,我真的不想要这个。第二件事是,我有一些OOM崩溃,我真的不知道该怎么办,一些更有经验的程序员能帮我吗 我的片段适配器代码:Android 通过加载图像创建RecyclerView的正确方法是什么?,android,json,android-recyclerview,Android,Json,Android Recyclerview,我正在尝试创建一个包含从服务器下载图像的片段的RecyclerView,但我遇到了一些问题: 当滚动到快速,你可以看到以前的图片,我真的不想要这个。第二件事是,我有一些OOM崩溃,我真的不知道该怎么办,一些更有经验的程序员能帮我吗 我的片段适配器代码: public class MyPliksAdapter extends RecyclerView.Adapter <MyPliksAdapter.MyViewHolder>{ private LayoutInflater infla
public class MyPliksAdapter extends RecyclerView.Adapter <MyPliksAdapter.MyViewHolder>{
private LayoutInflater inflater;
private List<MyPlikClass> myPliksList = Collections.emptyList();
VolleySingleton volleySingleton;
ImageLoader imageLoader;
public MyPliksAdapter (Context context, List<MyPlikClass> myPliks) {
inflater = LayoutInflater.from(context);
myPliksList =myPliks;
volleySingleton = VolleySingleton.getsInstance();
imageLoader = volleySingleton.getImageLoader();
}
@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = inflater.inflate(R.layout.fragment_my_pliks_single,parent,false);
MyViewHolder holder = new MyViewHolder(view);
return holder;
}
@Override
public void onBindViewHolder(final MyViewHolder holder, int position) {
final MyPlikClass currentItem = myPliksList.get(position);
//TODO:
if (currentItem.myPlikUserFromImgUrl != null ){
imageLoader.get(currentItem.myPlikUserFromImgUrl, new ImageLoader.ImageListener() {
@Override
public void onResponse(ImageLoader.ImageContainer imageContainer, boolean b) {
holder.myPlikUserFromImg.setImageBitmap(imageContainer.getBitmap());
}
@Override
public void onErrorResponse(VolleyError volleyError) {
}
});
}
if (currentItem.myPlikPhotoUrl != null){
holder.myPlikPhoto.setImageUrl(currentItem.myPlikPhotoUrl,imageLoader );
//(, "Wrong sesion, pls relogin", Toast.LENGTH_SHORT).show();
}
//holder.myPlikGetDate.setText(currentItem.myPlikGetDate);
byte[] titleData = Base64.decode(currentItem.myPlikTitle, Base64.DEFAULT);
byte[] descriptionData = Base64.decode(currentItem.myPlikDescription, Base64.DEFAULT);
byte[] nameData = Base64.decode(currentItem.myPlikUserFromName, Base64.DEFAULT);
//byte[] data = Base64.decode(currentItem.myPlikTitle, Base64.DEFAULT);
String title = null;
String name = null;
String description = null;
try {
title = new String(titleData, "UTF-8");
name = new String(nameData, "UTF-8");
description = new String(descriptionData, "UTF-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
if(description != null && !description.isEmpty()) {
holder.myPlikDeskription.setText(description);
holder.descriptionLayout.setVisibility(View.VISIBLE);
}
holder.myPlikTitle.setText(title);
holder.myPlikUserFromName.setText(name);
holder.myPlikUserFromNickname.setText(currentItem.myPlikUserFromNickname);
}
@Override
public int getItemCount() {
return myPliksList.size();
}
class MyViewHolder extends RecyclerView.ViewHolder {
NetworkImageView myPlikPhoto;
ImageView myPlikUserFromImg;
TextView myPlikUserFromName;
ImageView myPlikDeskriptionIcon;
TextView myPlikDeskription;
TextView myPlikUserFromNickname;
//TextView myPlikGetDate;
TextView myPlikTitle;
RelativeLayout descriptionLayout;
//RecyclerView recyclerView;
//GalleryAdapter adapter;
public MyViewHolder(View itemView) {
super(itemView);
myPlikTitle = (TextView) itemView.findViewById(R.id.myPlikTitle);
myPlikUserFromName = (TextView) itemView.findViewById(R.id.myPlikUserFromName);
myPlikUserFromNickname = (TextView) itemView.findViewById(R.id.myPlikUserFromNickname);
myPlikUserFromImg = (ImageView) itemView.findViewById(R.id.myPlikUserFromImg);
myPlikPhoto = (NetworkImageView) itemView.findViewById(R.id.profile_plick_content_img);
myPlikDeskription = (TextView) itemView.findViewById(R.id.profile_plick_content_description);
myPlikDeskriptionIcon = (ImageView) itemView.findViewById(R.id.profile_plik_content_comment_icon);
descriptionLayout = (RelativeLayout) itemView.findViewById(R.id.descripdion_block);
//adapter = new GalleryAdapter(inflater.getContext(), getImgIds());
//recyclerView = (RecyclerView) itemView.findViewById(R.id.galleryList);
}
}
}
公共类MyPliksAdapter扩展了RecyclerView.Adapter{
私人充气机;
私有列表myPliksList=Collections.emptyList();
单打单打单打单打;
图像加载器;
公共MyPliksAdapter(上下文,列表myPliks){
充气器=充气器。从(上下文);
myPliksList=myPliks;
volleySingleton=volleySingleton.getsInstance();
imageLoader=volleySingleton.getImageLoader();
}
@凌驾
公共MyViewHolder onCreateViewHolder(视图组父级,int-viewType){
视图=充气机。充气(R.layout.fragment\u my\u pliks\u single,parent,false);
MyViewHolder=新的MyViewHolder(视图);
报税表持有人;
}
@凌驾
公共无效onBindViewHolder(最终MyViewHolder,内部位置){
最终MyPlikClass currentItem=myPliksList.get(位置);
//待办事项:
if(currentItem.myPlikUserFromImgUrl!=null){
获取(currentItem.myPlikUserFromImgUrl,新的imageLoader.ImageListener(){
@凌驾
public void onResponse(ImageLoader.ImageContainer ImageContainer,布尔b){
holder.myPlikUserFromImg.setImageBitmap(imageContainer.getBitmap());
}
@凌驾
公共错误响应(截击错误截击错误){
}
});
}
if(currentItem.myplikphotour!=null){
holder.myPlikPhoto.setImageUrl(currentItem.myplikphotour,imageLoader);
//(,“错了,请重新登录”,Toast.LENGTH_SHORT)。show();
}
//holder.myPlikGetDate.setText(currentItem.myPlikGetDate);
字节[]titleData=Base64.decode(currentItem.myPlikTitle,Base64.DEFAULT);
字节[]descriptionData=Base64.decode(currentItem.myPlikDescription,Base64.DEFAULT);
字节[]nameData=Base64.decode(currentItem.myPlikUserFromName,Base64.DEFAULT);
//字节[]数据=Base64.decode(currentItem.myPlikTitle,Base64.DEFAULT);
字符串标题=null;
字符串名称=null;
字符串描述=null;
试一试{
标题=新字符串(标题数据,“UTF-8”);
名称=新字符串(名称数据,“UTF-8”);
description=新字符串(descriptionData,“UTF-8”);
}捕获(不支持的编码异常e){
e、 printStackTrace();
}
if(description!=null&!description.isEmpty()){
holder.myPlikDeskription.setText(说明);
holder.descriptionLayout.setVisibility(视图可见);
}
持有人.myPlikTitle.setText(标题);
holder.myPlikUserFromName.setText(名称);
holder.myplikuserfromnick.setText(currentItem.myplikuserfromnick);
}
@凌驾
public int getItemCount(){
返回myPliksList.size();
}
类MyViewHolder扩展了RecyclerView.ViewHolder{
NetworkImageView myPlikPhoto;
ImageView myPlikUserFromImg;
TextView myPlikUserFromName;
ImageView Myplikdeskription;
文本视图myPlikDeskription;
TextView MyplikuserFrom昵称;
//text查看myPlikGetDate;
文本视图myPlikTitle;
相对性描述布局;
//回收视图回收视图;
//厨房适配器;
公共MyViewHolder(查看项目视图){
超级(项目视图);
myPlikTitle=(TextView)itemView.findViewById(R.id.myPlikTitle);
myPlikUserFromName=(TextView)itemView.findViewById(R.id.myPlikUserFromName);
MyPlikuserFrom昵称=(TextView)itemView.findViewById(R.id.MyPlikuserFrom昵称);
myPlikUserFromImg=(ImageView)itemView.findViewById(R.id.myPlikUserFromImg);
myPlikPhoto=(NetworkImageView)itemView.findViewById(R.id.profile\u plick\u content\u img);
myPlikDeskription=(TextView)itemView.findViewById(R.id.profile\u plick\u content\u description);
myPlikDeskriptionIcon=(ImageView)itemView.findViewById(R.id.profile\u plik\u content\u comment\u图标);
descriptionLayout=(RelativeLayout)itemView.findViewById(R.id.Description_块);
//adapter=新的GalleryAdapter(充气器.getContext(),getImgIds());
//recyclerView=(recyclerView)itemView.findViewById(R.id.galleryList);
}
}
}
这个问题非常复杂,所以我建议使用
毕加索
()来处理图像问题。它在适配器中处理ImageView回收和下载取消
此外,还有一个关于如何在列表中加载图像时处理并发问题的官方指南:。此解决方案基于AsyncTask
,同样有效
对于OOM问题,请尝试在将图像加载到内存之前对其进行降采样。选中此项: