5

Ich versuche, eine Liste-Aktivität mit benutzerdefinierten Adapter zugreifen.Ich habe es direkt ohne Verwendung eines benutzerdefinierten Adapters versucht es funktionierte gut, aber weil ich weitere Funktionen in List-View hinzufügen möchte ich ein implementieren Custom adapter.Jetzt habe ich es versucht, aber ich bekomme eine leere Listenansicht ohne sichtbare Daten. List-AktivitätVerwendung benutzerdefinierter 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); 

      } 
    } 

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

Antwort

13

Wenn ein Cursor-Adapter erstreckt, sollten Sie die Methoden bindView und newView außer Kraft setzen. Die bindView-Methode wird verwendet, um alle Daten an eine bestimmte Ansicht zu binden, z. B. um den Text in einer TextView festzulegen. Die newView-Methode wird verwendet, um eine neue Ansicht aufzublähen und sie zurückzugeben. Zu diesem Zeitpunkt binden Sie keine Daten an die Ansicht. Die meisten Adapter verwenden die getView-Funktion, aber beim Erweitern eines Cursor-Adapters sollten Sie bindView und newView verwenden.

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

Ich bin in der Lage, Daten in der Listenansicht zu erhalten, aber nur erste Zeile Daten erscheint in allen Zeilen.Überprüfen Sie meine aktualisierte Frage. –

+0

Ich bin ein bisschen verwirrt, was Sie geändert haben, aber Sie sollten zu den beiden oben genannten Methoden wechseln. Wie auch immer ich denke, das Problem, das Sie haben, ist, dass Sie den Cursor-Index nicht bewegen. Sie sollten cr.moveToPosition (position) aufrufen, bevor Sie Daten aus dem Cursor ziehen. Wechseln Sie die newView-bindView-Methoden, um das Aufblähen neuer Ansichten zu reduzieren, da Sie nicht überprüfen, ob convertView null ist, und sie erneut verwenden. – Bobbake4

+0

Sie drucken auch den Index der Spalten, nicht die tatsächlichen Daten, die im Cursor gespeichert sind. – Bobbake4

1

Sie besser, diese Zeilen Code in Ihre customadaptergetview Funktion schreiben. Es funktioniert für mich und wird für Sie arbeiten, es ist einfach.

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, ich kann nicht sehen, wie sauber diese Lösung ist –

Verwandte Themen