如何从DataBase将图像加载到ListView中?

时间:2011-11-14 20:13:39

标签: java android sqlite cursor

我正在使用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;
    }
}

2 个答案:

答案 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项目 通过使用职位。