我正在尝试使用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();
}}
答案 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。
如果您在执行此操作时遇到问题,我真的建议您阅读文档或关于滑行的问题。