【问题标题】:What is a right way of creating RecyclerView with loading images?使用加载图像创建 RecyclerView 的正确方法是什么?
【发布时间】:2015-10-03 15:32:50
【问题描述】:

我正在尝试使用从服务器下载图像的片段创建 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);

    }

}
}

【问题讨论】:

    标签: android json android-recyclerview


    【解决方案1】:

    这个问题很复杂,所以我推荐使用Picasso(http://square.github.io/picasso/)来处理图像问题。它在适配器中处理 ImageView 回收和下载取消。

    还有一个官方指南,介绍如何在列表中加载图像时处理并发问题:http://developer.android.com/training/displaying-bitmaps/process-bitmap.html。这个基于AsyncTask 的解决方案也可以。

    对于 OOM 问题,请尝试在图像加载到内存之前对其进行下采样。检查这个:http://developer.android.com/training/displaying-bitmaps/load-bitmap.html

    【讨论】:

      猜你喜欢
      • 2017-03-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-01
      • 2018-05-28
      相关资源
      最近更新 更多