2009-08-20 2 views
2

이 코드를 사용하여 커서에서 항목을 가져 오지만 목록에 하나의 항목 만 반환합니다. 그래서, 어떻게 내 목록에있는 모든 항목을 가져올 수 있습니까? 이것이 내 코드입니까?안드로이드에서 커서의 모든 항목 가져 오기

class MyAdapter extends SimpleCursorAdapter 
{ 
    private Context context; 

    public MyAdapter(Context context, int layout, Cursor c, String[] from, int[] to) 
    { 
     super(context, layout, c, from, to); 
     this.context = context; 

    } 
    public View getView(int position, View convertView, ViewGroup parent){ 
     Cursor cursor = getCursor(); 

     LayoutInflater inflater = ((Activity) context).getLayoutInflater();   
     View v = inflater.inflate(R.layout.sbooks_row, null);   
     TextView title = (TextView)findViewById(R.id.title); 
     if(title != null){ 
      int index = cursor.getColumnIndex(SBooksDbAdapter.KEY_TITLE); 
      String type = cursor.getString(index); 
      title.setText(type); 
     } 

     TextView lyrics = (TextView)findViewById(R.id.lyrics); 
     if(lyrics != null){ 
      int index = cursor.getColumnIndex(SBooksDbAdapter.KEY_LYRICS); 
      String type = cursor.getString(index); 
      lyrics.setText(type); 
     } 

     ImageView im = (ImageView)findViewById(R.id.icon); 
     if(im!=null){ 
      int index = cursor.getColumnIndex(SBooksDbAdapter.KEY_FAVORITE); 
      int type = cursor.getInt(index); 
      if(type==1){ 
       im.setImageResource(android.R.drawable.btn_star_big_on); 
      } 
      else{ 
       im.setImageResource(android.R.drawable.btn_star_big_off); 
      } 
     } 

     return v; 
    } 

답변

5

CursorAdapter는 다른 목록 어댑터보다 조금 다른 동작 메서드를 오버라이드 (override)합니다.

첫 번째 행을 만든 후 CursorAdapter는 bindView()가 새 데이터를 삽입하고 이미 팽창 된 행을 다시 사용하고 getView()가이를 수행 할 것으로 예상하므로 하나의 결과 만 얻을 수 있습니다.

코드를 newView()로 이동하여보기를 확대하고, 행을 채우는 실제 논리를 실행하기 위해 bindView()를 사용하도록 제안합니다.

행운을 비네하고 결과를 최신으로 유지하십시오.

+0

안녕하세요, 귀하의 조언과 함께 내 코드를 수정하려고합니다. newView(), bindView() 함수를 사용하고 모든 항목을 반환합니다. 하지만 여전히 Listview에 문제가 있습니다. 정상적으로 표시되지 않습니다. 나는 이것이 스크롤 바를 위아래로 끌 때 다르게 표시합니다. 뭔가 잊을 수 있니? – Dennie

+0

항목이 정상적으로 표시되지 않는다는 것은 무엇을 의미합니까? 오래된 항목이 표시되면 새 항목 대신 (정상적인 어댑터로 인해 발생하는) 대신 재활용 로직 (bindView())에 문제점이 있어야합니다. 여기에 설명 된대로 ViewHolder 패턴을 사용하는 것이 좋습니다. http://www.youtube.com/watch?v=N6YdwzAvwOA at 0:09:02 –

+0

해당 비디오 링크는 ListView 아래에서 무슨 일이 벌어지고 있는지 이해하고자하는 모든 사용자에게 매우 유용합니다. 감사 드미 타르! –

0

내가 방법을 제대로 테이블의 모든 행을 검색하는)합니다 (getCursor에 의해 반환 된 커서를 추정하고, 명시 적으로하므로, 행의 데이터에 액세스하기 전에 위치로 커서를 이동해야하는 호출해야하는 getView() 메소드의 시작 부분. 대신의 getView()가, 마법이 여기 newView()과의 Bindview()에서 발생에서의, 그래서의 getView()가 옳지 않다 생각 -

cursor.moveToPosition(position); 
+0

여전히 하나의 상품을 반환합니다! 나는 그것이 여기에서 일하지 않는다고 생각한다. – Dennie

관련 문제