Как загрузить изображения в ListView из DateBase? - PullRequest
0 голосов
/ 15 ноября 2011

Я заполняю свой listview с SimpleCursorAdapter.Используя getView(), я установил изображение на imageView для каждого элемента.

Теперь у меня есть только 1 изображение (в первом ряду) в моем 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 ]

2 голосов
/ 15 ноября 2011

это потому что переработка ListView ... ListView создает только видимые элементы + еще несколько. если вы прокрутите невидимые элементы, они будут использованы повторно, если они больше не видны. Вы устанавливаете только первое изображение (как вы сказали, что только первая строка в курсоре имеет данные BLOB-объектов) так что если первая строка будет повторно использована, вы получите строку с изображением, уже настроенным на первую.

, поэтому используйте

        if (blob!=null) {
            holder.imgSm.setImageBitmap(BitmapFactory.decodeByteArray(blob, 0, blob.length));
        }else{
           holder.imgSm.setImageResource(0);
        }
1 голос
/ 15 ноября 2011

Поскольку ваш ListView в основном не знает, какое изображение он рендерит, и когда вы прокручиваете вверх и вниз, он обновляет себя и перерисовывает изображение случайным образом. Вы должны отслеживать, какое изображение принадлежит к какому элементу ListView вы можете достичь этого используя позицию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...