5

Özel bağdaştırıcı kullanarak bir liste etkinliğine erişmeye çalışıyorum.İyi çalışan herhangi bir özel bağdaştırıcı kullanmadan doğrudan denedim ama liste görünümünde daha fazla işlev eklemek istiyorum çünkü uygulamak istiyorum özel adaptör.Şimdi denedim ama hiçbir veri görünür boş liste görünümü alıyorum. Liste-AktiviteÖzel simpleCursorAdapter kullanma

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); 

      } 
    } 

Custom-Adaptör

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

cevap

13

bir imleç adaptör size yöntemleri bindView ve newView geçersiz kılar uzanan. BindView yöntemi, tüm verileri belirli bir görünümle Metin Görünümü'nde metin gibi ayarlamak için kullanılır. NewView yöntemi yeni bir görünümü şişirmek ve döndürmek için kullanılır, bu noktada herhangi bir veriyi görüntüye bağlamazsınız. Çoğu bağdaştırıcı, getView işlevini kullanır ancak bir imleç bağdaştırıcısını genişletirken bindView ve newView kullanmalısınız.

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

Liste görünümünde veri alabiliyorum ancak tüm satırlarda yalnızca ilk satır verileri görünüyor. Güncellenen sorumu kontrol edin. –

+0

Ne değiştirdiğini biraz karıştırdım ama yukarıda bahsettiğim iki yönteme geçmelisin. Her iki durumda da karşılaştığınız problemi imleç indeksini hareket ettirmiyorsunuz. İmleci veriyi çekmeden önce cr.moveToPosition (konum) 'u çağırmalısınız. ConvertView öğesinin boş olup olmadığını kontrol etmediğiniz için yeni görünümlerin şişirilmesi ihtiyacını azaltmak için newView bindView yöntemlerini değiştirin. – Bobbake4

+0

Ayrıca, imleçte depolanan gerçek veriler değil de sütunların dizinini yazdırıyorsunuz. – Bobbake4

1

daha iyi customadaptergetview işlev kodu bu satırları yazın. Benim için çalışıyor ve senin için çalışacak, bu basit.

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

Mmm, Bu çözümün ne kadar temiz olduğunu göremiyorum –