5

사용자 정의 어댑터를 사용하여 목록 활동에 액세스하려고합니다. 제대로 작동하는 사용자 정의 어댑터를 사용하지 않고 직접 시도했지만 목록보기에 더 많은 기능을 추가하려고하기 때문에 사용자 정의 adapter.Now 그것을 시도했지만 데이터가 표시되지 않은 빈 목록보기지고있다. 목록-활동사용자 정의 simpleCursorAdapter 사용

public class MainActivity extends ListActivity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     String selection = MediaStore.Audio.Media.IS_MUSIC + " != 0"; 

     String[] projection = { 
        MediaStore.Audio.Media._ID, 
        MediaStore.Audio.Media.ARTIST, 
        MediaStore.Audio.Media.TITLE, 
        MediaStore.Audio.Media.DATA, 
        MediaStore.Audio.Media.DISPLAY_NAME, 
        MediaStore.Audio.Media.DURATION, 

      }; 
      //query 

      musiccursor = this.managedQuery(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,projection,selection,null,sortOrder); 
      music_column_index = musiccursor.getColumnIndexOrThrow(MediaStore.Audio.Media.DATA); 


      int a[]= new int[]{R.id.TitleSong,R.id.Artist}; 


      Custom_Adapter adapter = new Custom_Adapter(this,R.layout.music_items, musiccursor, new String[]{MediaStore.Audio.Media.TITLE,MediaStore.Audio.Media.ARTIST} ,a); 

      this.setAdapter(adapter); 

      } 
    } 

맞춤 어댑터

public class Custom_Adapter extends SimpleCursorAdapter { 


    private Context mContext; 
    private Context appContext; 
    private int layout; 
    private Cursor cr; 
    private final LayoutInflater inflater; 

    public Custom_Adapter(Context context,int layout, Cursor c,String[] from,int[] to) { 
     super(context,layout,c,from,to); 
     this.layout=layout; 
     this.mContext = context; 
     this.inflater=LayoutInflater.from(context); 
     this.cr=c; 
    } 

    @Override 
    public void bindView(View view, Context context, Cursor cursor) { 
     // TODO Auto-generated method stub 
     super.bindView(view, context, cursor); 
    view=inflater.inflate(layout, null, false); 
     TextView titleS=(TextView)view.findViewById(R.id.TitleSong); 
     TextView artistS=(TextView)view.findViewById(R.id.Artist); 
     int Title_index; 
     int Artist_index; 
     cursor.moveToFirst(); 
     while(cursor.isLast()){ 

      Title_index=cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.DISPLAY_NAME); 
      Artist_index=cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.ARTIST); 
      titleS.setText(cursor.getString(Title_index)); 
      artistS.setText(cursor.getString(Artist_index)); 
      cr.moveToNext(); 
      } 

    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     // TODO Auto-generated method stub 

     return convertView; 
    } 
} 

답변

13

커서 어댑터 당신이 방법 bindViewnewView를 오버라이드 (override) 할 필요가 확장. bindView 메서드는 TextView의 텍스트 설정과 같이 모든 데이터를 지정된보기에 바인딩하는 데 사용됩니다. newView 메소드는 새로운 뷰를 팽창시키고 리턴하기 위해 사용되며, 뷰에 아무런 데이터도 바인딩하지 않습니다. 대부분의 어댑터는 getView 함수를 사용하지만 커서 어댑터를 확장 할 때는 bindView와 newView를 사용해야합니다.

public class Custom_Adapter extends SimpleCursorAdapter { 

      private Context mContext; 
      private Context appContext; 
      private int layout; 
      private Cursor cr; 
      private final LayoutInflater inflater; 

      public Custom_Adapter(Context context,int layout, Cursor c,String[] from,int[] to) { 
       super(context,layout,c,from,to); 
       this.layout=layout; 
       this.mContext = context; 
       this.inflater=LayoutInflater.from(context); 
       this.cr=c; 
      } 

      @Override 
      public View newView (Context context, Cursor cursor, ViewGroup parent) { 
        return inflater.inflate(layout, null); 
      } 

      @Override 
      public void bindView(View view, Context context, Cursor cursor) { 
       super.bindView(view, context, cursor); 
       TextView titleS=(TextView)view.findViewById(R.id.TitleSong); 
       TextView artistS=(TextView)view.findViewById(R.id.Artist); 

       int Title_index=cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.DISPLAY_NAME); 
       int Artist_index=cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.ARTIST); 

       titleS.setText(cursor.getString(Title_index)); 
       artistS.setText(cursor.getString(Artist_index)); 

      } 

    } 
+0

목록보기에서 데이터를 가져올 수 있지만 첫 번째 행 데이터 만 모든 행에 나타납니다. 업데이트 된 질문을 확인하십시오. –

+0

나는 조금 혼란스러워하지만 위에서 언급 한 두 가지 방법으로 전환해야합니다. 어쨌든 나는 당신이 겪고있는 문제가 커서 인덱스를 움직이지 않는다고 생각합니다. 커서에서 데이터를 꺼내기 전에 cr.moveToPosition (position)을 호출해야합니다. newView bindView 메소드를 전환하면 convertView가 null인지 확인하고 다시 사용하지 않아도 새 뷰를 팽창시킬 필요가 줄어 듭니다. – Bobbake4

+0

커서의 실제 데이터가 아닌 열의 색인도 인쇄합니다. – Bobbake4

1

당신은 더 나은 귀하의 customadaptergetview 기능에 코드 줄을 씁니다. 그것은 나를 위해 일하고 당신을 위해 일할 것입니다, 그것은 간단합니다.

if (convertView == null) { 
    music_column_index = myCursor.getColumnIndexOrThrow(MediaStore.Audio.Media.DISPLAY_NAME); 
    myCursor.moveToPosition(position); 
    id = myCursor.getString(music_column_index); 
    music_column_index = myCursor.getColumnIndexOrThrow(MediaStore.Audio.Media.SIZE); 
    myCursor.moveToPosition(position); 
    id += " Size(KB):" + myCursor.getString(music_column_index); 
    Log.d("TAG", "id::" + id); 
    tv.setText(id); 
} else 
    tv = (TextView) convertView; 
    return tv; 
} 
+0

음,이 솔루션이 얼마나 깨끗한 지 알 수 없습니다. –

관련 문제