2011-11-14 23 views
0

私はlistviewSimpleCursorAdapterで記入しています。 getView()を使用して、画像をimageViewに設定しました。DateBaseからListViewに画像を読み込む方法は?

今、私はcursorに1画像(最初の行に)しかありません。しかしスクロールでは、ランダムな位置に表示されます。それはなぜそうですか?

コード

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; 
    } 
} 
+1

を使用;'編集:それは動作しません(0) 'imgSm.setImageResourceを試してみてください;'(ブロブがnullの場合) – Selvin

+0

感謝!!!それは動作します!!!) それを答えると私はそれを受け入れるでしょう。 – Sviatoslav

+0

ここで詳しく説明します – Selvin

答えて

2

リストビューリサイクル... リストビューは目に見えるアイテムのみ作成しています。 目に見えないアイテムをスクロールすると、目に見えなくなったアイテムは再利用されます。 最初のイメージのみを設定しています(カーソルの最初の行にはBLOBデータがあります) 最初の行が再使用されると、イメージallreadyが1つ目の行になります。ブロブがnullの使用が `imgSm.setImageBitmap(ヌル)の場合

ので

 if (blob!=null) { 
      holder.imgSm.setImageBitmap(BitmapFactory.decodeByteArray(blob, 0, blob.length)); 
     }else{ 
      holder.imgSm.setImageResource(0); 
     } 
1

あなたのListViewがbasicly doesntのあなたはスクロールアップされ、ダウン、それは自分自身をリフレッシュしていますし、ランダムに画像を再描画するとき、それはレンダリングしていますどの画像を知っているので。 位置を使用して、どの画像がどのを達成できるリストビュー項目に属しているかを把握する必要があります。

+1

Listviewはなぜthis.cur.getString(this.cur.getColumnIndex( "...")) 'が属している行を理解していますか?this.cur.getBlob(this.cur.getColumnIndex ( "img_sm")) ' - そうではありませんか? – Sviatoslav

+0

あなたはどういう意味ですか? –