我正在使用 SimpleCursorAdapter
填充我的 listview
。
通过使用 getView(),我将每个项目的图像设置为 imageView。
现在我的光标
中只有一张图像(在第一行)。但在滚动时它会出现在随机位置。为什么会这样?
代码
public class MyListAdapter extends SimpleCursorAdapter{
private Cursor cur;
private Context context;
private SQLiteDatabase db;
public MyListAdapter (Context context, Cursor c, SQLiteDatabase db) {
super(context, R.layout.list_item, c, new String[] {}, new int[] {});
this.cur=super.getCursor();
this.context = context;
this.db=db;
}
private class ViewHolder {
TextView txtTitle, txtDate;
ImageView imgSm;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder = null;
if (convertView == null) {
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = inflater.inflate(R.layout.list_item, null);
holder = new ViewHolder();
holder.txtTitle = (TextView) convertView.findViewById(R.id.txt_title);
holder.txtDate = (TextView) convertView.findViewById(R.id.txt_date);
holder.imgSm= (ImageView) convertView.findViewById(R.id.img_sm);
convertView.setTag(holder);
}
else {
holder = (ViewHolder) convertView.getTag();
}
this.cur.moveToPosition(position);
holder.txtTitle.setText(this.cur.getString(this.cur.getColumnIndex("title")));
holder.txtDate.setText(this.cur.getString(this.cur.getColumnIndex("date")));
byte[] blob = this.cur.getBlob(this.cur.getColumnIndex("img_sm"));
if (blob!=null) {
holder.imgSm.setImageBitmap(BitmapFactory.decodeByteArray(blob, 0, blob.length));
}
return convertView;
}
}
最佳答案
因为ListView回收... ListView 仅创建可见项目以及其他一些项目。 如果滚动,不可见的项目将在不再可见时被重复使用。 您仅设置第一个图像(正如您所说,光标中只有第一行有 blob 数据) 因此,如果重新使用第一行,您将得到一行,其中图像已准备好设置为第一行。
所以使用
if (blob!=null) {
holder.imgSm.setImageBitmap(BitmapFactory.decodeByteArray(blob, 0, blob.length));
}else{
holder.imgSm.setImageResource(0);
}
关于java - 如何将数据库中的图片加载到ListView中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8127467/