java - 如何将数据库中的图片加载到ListView中?

标签 java android sqlite cursor

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

相关文章:

SQLite 索引

java.sql.SQLException : Column not found Error?

java - Java 文件夹的 Zip 内容

java - 算术异常 :/by zero only works on integers in Java

android - ListPreference 字体大小

python - Django创建的sqlite数据库文件在哪里?

java - SSE 发射器 : Manage timeouts and complete()

java - 如何在 java/android 中漂亮地格式化 GPS 数据?

安卓定时器停止运行

sqlite - 在 sqlite3 : copy a column from one table to another table