5

Sto tentando di accedere a un'attività elenco utilizzando un adattatore personalizzato. L'ho provato direttamente senza utilizzare alcun adattatore personalizzato funzionava bene ma perché voglio aggiungere più funzioni in lista-vista Voglio implementare un adattatore personalizzato. Ora ho provato, ma sto ottenendo una lista-vista vuota senza dati visibili. List-ActivityUtilizzo di custom 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); 

      } 
    } 

Custom-adattatore

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

risposta

13

Quando si estende un adattatore cursore si dovrebbe ignorare i metodi bindView e newView. Il metodo bindView viene utilizzato per associare tutti i dati a una determinata vista, ad esempio l'impostazione del testo su TextView. Il metodo newView è usato per gonfiare una nuova vista e restituirla, non legare nessun dato alla vista a questo punto. La maggior parte degli adattatori utilizza la funzione getView ma quando si estende un adattatore del cursore è necessario utilizzare bindView e 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

Sono in grado di ottenere dati nella visualizzazione elenco ma solo i dati della prima riga vengono visualizzati in tutte le righe. Controllare la mia domanda aggiornata. –

+0

Sono un po 'confuso su cosa hai cambiato, ma dovresti passare ai due metodi che ho menzionato sopra. In entrambi i casi, penso che il problema che stai riscontrando sia che non stai spostando l'indice del cursore. Dovresti chiamare cr.moveToPosition (posizione) prima di estrarre i dati dal cursore. Cambia i metodi newView bindView per ridurre la necessità di gonfiare nuove viste poiché non stai controllando se convertView è nullo e riutilizzandolo. – Bobbake4

+0

Si sta inoltre stampando l'indice delle colonne non i dati effettivi memorizzati nel cursore. – Bobbake4

1

è meglio scrivere queste righe di codice nel tuo customadaptergetview funzione. Funziona per me e funzionerà per te, è semplice.

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, non riesco a vedere quanto sia pulita questa soluzione –