如何消除显示从相机捕获的图像的 RecyclerView 中的滞后?

How to remove lagging in RecyclerView showing captured images from the camera?

我正在使用 RecyclerView 在卡片上显示从相机拍摄的图像。我不知道为什么每当我向下滚动屏幕时应用程序都会滞后。我还使用 Picasso 异步加载图像。请帮忙。下面是代码:

检查onBindViewHolder函数

import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.support.v7.widget.RecyclerView;
import android.text.Html;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;

import com.squareup.picasso.Picasso;

import java.io.File;
import java.util.ArrayList;
import java.util.List;

public class DiaryAdapter extends RecyclerView.Adapter<DiaryAdapter.ViewHolder> {

List <DiaryInfo> mItems;

public DiaryAdapter() {
    super();
    mItems = new ArrayList <DiaryInfo> ();
    mItems = MainActivity.diaryinfo;
}

@Override
public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
    View v = LayoutInflater.from(viewGroup.getContext())
            .inflate(R.layout.content_main, viewGroup, false);
    ViewHolder viewHolder = new ViewHolder(v);
    return viewHolder;
}

@Override
public void onBindViewHolder(ViewHolder viewHolder, int i) {
    DiaryInfo info = mItems.get(i);
    viewHolder.date.setText(info.getDate());
    viewHolder.desc.setText(Html.fromHtml((info.getDesc()).replaceAll("''","\"")));

    String data = info.getThumbnail();

    String path=""; // Final path of the thumbnail

    final SQLiteDatabase mydatabase = (MainActivity.mContext).openOrCreateDatabase("remember", android.content.Context.MODE_PRIVATE, null);

    // While changing database information here change at Itemadd's done button listener also!
    mydatabase.execSQL("CREATE TABLE IF NOT EXISTS memories_pics(id VARCHAR PRIMARY KEY, path VARCHAR)");

    Cursor cursor = mydatabase.rawQuery("SELECT * FROM memories_pics WHERE id=\'" + data + "\' LIMIT 1", null);
    if (cursor.moveToFirst()) {
        while (cursor.isAfterLast() == false) {
            path = cursor.getString(cursor
                    .getColumnIndex("path"));
            cursor.moveToNext();
            break;
        }
    }
    cursor.close();

    //Bitmap bmp = BitmapFactory.decodeFile(String.valueOf(path.split("=")[0]));
    //viewHolder.imgThumbnail.setImageURI(Uri.parse(String.valueOf(path.split("=")[0])));
    File file = new File(String.valueOf(path.split("=")[0]));
    Picasso.with(MainActivity.mContext).load(file).into(viewHolder.imgThumbnail);
}

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

public Object getItem(int pos) { return mItems.get(pos); }

class ViewHolder extends RecyclerView.ViewHolder {

    public ImageView imgThumbnail;
    public TextView date, desc;

    public ViewHolder(View itemView) {
        super(itemView);
        imgThumbnail = (ImageView) itemView.findViewById(R.id.thumbnail);
        date = (TextView)itemView.findViewById(R.id.date);
        desc = (TextView)itemView.findViewById(R.id.description);
    }
}

}

尝试使用

Picasso.with(MainActivity.mContext).load(file).fit().centerCrop().into(viewHolder.imgThumbnail);

您正在执行 2 个数据库操作,每个 onBindViewHolder。我认为您应该使 onBindViewHolder 尽可能简单。如果 table 在您的应用程序启动时不存在,则只需创建它,并在创建适配器(异步)时加载所有图像 paths (不是图像)。如果有很多图片,可能会加载一些以便快速显示,而其他的则在后台加载。

然后确保您有

<application android:hardwareAccelerated="true" ...> 在你的 AppManifest.xml 集合中。