5

Próbuję uzyskać dostęp do listy działań za pomocą niestandardowego adaptera. Próbowałem go bezpośrednio, bez użycia niestandardowego adaptera, który działał dobrze, ale dlatego, że chcę dodać więcej funkcji w widoku listy Chcę zaimplementować niestandardowy adapter. Teraz próbowałem go, ale otrzymuję pusty widok listy bez widocznych danych. Lista-ActivityUżywanie niestandardowego 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); 

      } 
    } 

zamówienie 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; 
    } 
} 

Odpowiedz

13

Przedłużając adapter kursor powinien przesłonić metody bindView i newView. Metoda bindView służy do wiązania wszystkich danych z danym widokiem, na przykład do ustawiania tekstu w widoku TextView. Metoda newView służy do nadmuchania nowego widoku i zwrócenia go, w tym momencie nie wiążesz żadnych danych z widokiem. Większość adapterów korzysta z funkcji getView, ale przy rozszerzaniu adaptera kursora należy używać bindView i 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

Jestem w stanie uzyskać dane w widoku listy, ale tylko dane pierwszego rzędu pojawiają się we wszystkich wierszach. Sprawdź moje zaktualizowane pytanie. –

+0

Jestem nieco zdezorientowany, co zmieniliście, ale powinniście przełączyć się na dwie metody, o których wspomniałem powyżej. Tak czy siak, uważam, że problem, którego doświadczasz, to nie przesuwasz wskaźnika kursora. Powinieneś zadzwonić cr.moveToPosition (pozycja) zanim wyciągniesz dane z kursora. Zmień metody newView bindView, aby zmniejszyć potrzebę nadmuchiwania nowych widoków, ponieważ nie sprawdzasz, czy convertView ma wartość zerową i czy używa go ponownie. – Bobbake4

+0

Drukujesz również indeks kolumn, a nie rzeczywiste dane przechowywane w kursorze. – Bobbake4

1

lepiej napisać te linie kodu w customadaptergetview funkcji. To działa dla mnie i będzie działać dla ciebie, to proste.

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, nie widzę, jak czyste jest to rozwiązanie –