如何消除显示从相机捕获的图像的 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
集合中。
我正在使用 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
集合中。