2011-11-14 3 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을 시도,'(BLOB가 null의 경우) – Selvin

+0

감사합니다 !!! 작동합니다 !!!) 답을하면 받아 들일 것입니다. – Sviatoslav

+0

여기에 더 많은 설명이 있습니다 – Selvin

답변

2

ListView 재활용이므로 ... ListView 만 보이는 항목 만 생성하면됩니다. 보이지 않는 항목을 스크롤하면 더 이상 표시되지 않으면 다시 사용됩니다. 첫 번째 이미지 만 설정하면 (커서의 첫 번째 행에만 BLOB 데이터가 있음) 첫 번째 행이 다시 사용되면 이미지 allready 설정이있는 행을 첫 번째로 가져옵니다. 덩어리가 null의 사용은`imgSm.setImageBitmap (NULL) 인 경우

그래서

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

당신의 ListView가 basicly 나던 당신이 스크롤하고 아래로 자체가 참신하고 무작위로 이미지를 다시 그릴 때 렌더링있어 어떤 이미지가 알고 있기 때문에. 위치를 사용하여 어떤 이미지가 어떤을 달성 할 수있는 ListView 항목에 속하는지 추적해야합니다.

+1

Listview는 'this.cur.getString (this.cur.getColumnIndex ("..."))'가 속한 행을 이해하고 this.cur.getBlob (this.cur.getColumnIndex ("img_sm"))'- 아닌가요? – Sviatoslav

+0

무엇을 의미합니까? –

관련 문제