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;
}
}
Jestem w stanie uzyskać dane w widoku listy, ale tylko dane pierwszego rzędu pojawiają się we wszystkich wierszach. Sprawdź moje zaktualizowane pytanie. –
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
Drukujesz również indeks kolumn, a nie rzeczywiste dane przechowywane w kursorze. – Bobbake4