我正在使用listview
填写SimpleCursorAdapter
。
使用getView()
我为每个项目将图片设置为imageView
。
现在我cursor
只有一张图片(在第一行)。但在滚动时它出现在随机位置。为什么会这样?
码
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;
}
}
答案 0 :(得分:2)
因为ListView回收...... ListView仅创建可见项目+更多。 如果滚动隐形项目,如果它们不再可见,将被重复使用。 你只设置第一个图像(正如你所说,只有光标中的第一行有blob数据) 因此,如果第一行被重用,则会获得一行图像已经设置为第一行。
所以使用
if (blob!=null) {
holder.imgSm.setImageBitmap(BitmapFactory.decodeByteArray(blob, 0, blob.length));
}else{
holder.imgSm.setImageResource(0);
}
答案 1 :(得分:1)
因为你的ListView基本上不知道它正在渲染哪个图像,当你上下滚动它时,它会自动刷新并随机重绘图像。 您需要跟踪哪个图像属于您可以实现的ListView项目 通过使用职位。