Android 通过加载图像创建RecyclerView的正确方法是什么?

Android 通过加载图像创建RecyclerView的正确方法是什么?,android,json,android-recyclerview,Android,Json,Android Recyclerview,我正在尝试创建一个包含从服务器下载图像的片段的RecyclerView,但我遇到了一些问题: 当滚动到快速,你可以看到以前的图片,我真的不想要这个。第二件事是,我有一些OOM崩溃,我真的不知道该怎么办,一些更有经验的程序员能帮我吗 我的片段适配器代码: public class MyPliksAdapter extends RecyclerView.Adapter <MyPliksAdapter.MyViewHolder>{ private LayoutInflater infla

我正在尝试创建一个包含从服务器下载图像的片段的RecyclerView,但我遇到了一些问题: 当滚动到快速,你可以看到以前的图片,我真的不想要这个。第二件事是,我有一些OOM崩溃,我真的不知道该怎么办,一些更有经验的程序员能帮我吗

我的片段适配器代码:

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问题,请尝试在将图像加载到内存之前对其进行降采样。选中此项: