当我尝试从SD卡加载图像时,我的画廊很不舒服(Android Recyclerview)

时间:2017-07-25 15:05:06

标签: android image performance android-recyclerview

我正在尝试使用Recycler视图和Sub Sampling Gallery实现Gallery App。 由于我的图像数量大约为850.当我尝试将图像加载到图库时,图库会滞后。

这是我的Recyclerview适配器: -

public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.RecyclerViewHolders> {

private ArrayList<String> yeniliste;
private Context context;

public RecyclerViewAdapter(Context context, ArrayList<String> itemList) {
    this.yeniliste = itemList;
    this.context = context;
}

@Override
public RecyclerViewHolders onCreateViewHolder(ViewGroup parent, int viewType) {
    View layoutView = LayoutInflater.from(parent.getContext()).inflate(R.layout.gallery_item, null);
    RecyclerViewHolders rcv = new RecyclerViewHolders(layoutView);
    return rcv;
}

@Override
public void onBindViewHolder(final RecyclerViewHolders holder, final int position) {
    try {
        Bitmap bitmap = BitmapFactory.decodeFile(yeniliste.get(position));
        holder.countryPhoto.setImage(ImageSource.bitmap(bitmap).dimensions(50,50));
    }catch (Exception e){
        e.printStackTrace();
    }

    holder.countryPhoto.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent intent = new Intent(v.getContext(),GalleryFullImage.class);
            intent.putExtra("realid",String.valueOf(holder.getAdapterPosition()));
            v.getContext().startActivity(intent);
        }
    });
}

@Override
public int getItemCount() {
    return this.yeniliste.size();
}


public static class RecyclerViewHolders extends RecyclerView.ViewHolder implements View.OnClickListener{

    public SubsamplingScaleImageView countryPhoto;

    public RecyclerViewHolders(View itemView) {
        super(itemView);
        countryPhoto = (SubsamplingScaleImageView)itemView.findViewById(R.id.country_photo);
    }

    @Override
    public void onClick(View view) {
        Toast.makeText(view.getContext(), "Clicked Country Position = " + getAdapterPosition(), Toast.LENGTH_SHORT).show();

    }

}

public void removeItem(int position)
{
    yeniliste.remove(position);
    notifyDataSetChanged();
}}

1 个答案:

答案 0 :(得分:0)

Bitmap bitmap = BitmapFactory.decodeFile(yeniliste.get(position));

这次电话有一些问题:

首先,加载到内存时你不是downscaling the image。如果您开始获得应用程序抛出的大量Out Of Memory异常,我不会感到惊讶。

其次,您正在UI线程中加载图像,这是一项昂贵的操作,并且会导致您遇到的延迟:您的应用程序在从磁盘加载图像时将无法呈现新帧。您需要使用后台线程来完成这项工作。最常见的方法是使用异步任务,一个示例描述为here

但最好的选择是使用库来为您处理。我真的推荐Glide。它已经处理了内存缩减,后台加载,快速重新加载的缓存,还有一个非常直观的API。

此代码:

Bitmap bitmap = BitmapFactory.decodeFile(yeniliste.get(position));
holder.countryPhoto.setImage(ImageSource.bitmap(bitmap).dimensions(50,50);

将成为:

GlideApp.with(context).load(eniliste.get(position)).override(50,50).centerCrop().into(new SimpleTarget<Bitmap>(50, 50) {
        @Override
        public void onResourceReady(Bitmap bitmap, GlideAnimation anim) {
         holder.countryPhoto.setImage(ImageSource.bitmap(bitmap));
        );

由于您没有使用简单的ImageView作为位图持有者,因此您需要使用custom target implementation

如果您在执行此操作时遇到问题,我真的建议您阅读文档或关于滑行的问题。