2016-03-22 4 views
0

Ich habe einen Kundenadapter (SongsAdapter), der ArrayAdapter erweitert und es enthält ein Array von Song Objekte. In meinen Fragmenten onCreateView Methode versuche ich diesen Adapter zu initialisieren.Erstellen eines Adapters für Listview, ohne zunächst ein Array zu übergeben

adapter = new SongsAdapter(getContext(), arrayOfSongs); 

Das Problem ist, dass anfänglich Null ist. Der Benutzer sollte für einen Song auf der iTunes-Datenbank suchen und wenn ich eine Antwort bekommen, ich habe die JSON parsen und Song-Objekte erstellen und sie dann zu meinem Adapter

adapter.addAll(songs); 

und dann

adapter.notifyDataSetChanged(); 

hinzufügen, aber ich erhalte eine Ausnahme

java.lang.NullPointerException at android.widget.ArrayAdapter.getCount 

Wie kann ich die Listenansicht, bis die erste Suche nach dem Benutzer zu verbergen, und es dann wieder sichtbar machen die Ergebnisse anzuzeigen. Wie würde ich den Adapter richtig initialisieren?

Hier ist mein Adapter

public class SongsAdapter extends ArrayAdapter<Song> { 


    public SongsAdapter(Context context, ArrayList<Song> songs) { 

     super(context, 0, songs); 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     Song song = getItem(position); 

     if (convertView == null) 
      convertView = LayoutInflater.from(getContext()).inflate(R.layout.item_song, parent, false); 

     TextView artistName = (TextView) convertView.findViewById(R.id.artistName); 
     TextView trackName = (TextView) convertView.findViewById(R.id.trackName); 

     artistName.setText(song.getArtist()); 
     trackName.setText(song.getTitle()); 

     return convertView; 
    } 
} 
+1

Machen Sie das Array zunächst Null statt Null. –

+0

Sie sollten eine leere ArrayList initialisieren, die in den Adapter eingefügt werden soll, anstatt einen Null-Check innerhalb des Adapters zu verwenden. –

Antwort

1

Sie können prüfen, ob die Arraylist in getCount Methode null ist und die Daten entsprechend zurück.

public class SongsAdapter extends BaseAdapter { 

ArrayList<Song> mList; 
Context mContext; 

public SongsAdapter(Context context, ArrayList<Song> songs) { 

    mList = songs; 
    mContext = context; 

} 



@Override 
public int getCount() { 
    if(mList==null) 
    { 

     return 0; 
    } 
    else { 

     return mList.size(); 


    } 
} 

@Override 
public Object getItem(int position) { 
    return mList.get(position); 
} 

@Override 
public long getItemId(int position) { 
    return 0; 
} 

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
     Song song = getItem(position); 

    if (convertView == null) 
     convertView = LayoutInflater.from(getContext()).inflate(R.layout.item_song, parent, false); 

    TextView artistName = (TextView) convertView.findViewById(R.id.artistName); 
    TextView trackName = (TextView) convertView.findViewById(R.id.trackName); 

    artistName.setText(song.getArtist()); 
    trackName.setText(song.getTitle()); 

    return convertView; 
} 
} 

Markieren Sie dies, wenn es hilft, sonst lassen Sie mich wissen, wenn Sie eine Beschreibung benötigen. Glückliche Kodierung.

+0

Mein Adapter befindet sich in einer separaten Datei, wie bekomme ich einen Verweis auf meine 'arrayList' (die zufälligerweise' songs' heißt) – Rockstar5645

+0

Sie übergeben ArrayOfSongs an Ihren Adapter. Verwenden Sie diese Liste, um den Adapter einzuchecken. –

+0

verstanden. Bruder.?? –