2016-12-11 5 views
1

Ich bin neu in ANdroid und dies ist mein erster Test auf Retrofit.Ich verwende RETOFIT zum Aufruf API wie folgt. Mein Problem ist, dass ich einen leeren Bildschirm bekomme, wenn ich die App starte. Ich möchte Audiodateien in einer Liste anzeigen und dann das ausgewählte Audio abspielen. meine api sieht wie folgt aus: enter image description hereVerwenden von Retrofit zum Aufruf der API

I Retrofit bin mit diesem Api .Dieses zu nennen ist, was Restclient und RestInterface ich verwende `

public class RestClient { 
private static RestInterface mInterface; 

public static RestInterface getClient() { 
    if (mInterface == null) { 

     OkHttpClient okClient = new OkHttpClient(); 
     okClient.interceptors().add(new Interceptor() { 
      @Override 
      public Response intercept(Chain chain) throws IOException { 
       Response response = chain.proceed(chain.request()); 
       return response; 
      } 
     }); 
     Retrofit client = new Retrofit.Builder() 
       .baseUrl(BASE_URL) 
       .addConverter(String.class, new ToStringConverter()) 
       .client(okClient) 
       .addConverterFactory(GsonConverterFactory.create()) 
       .build(); 
     mInterface = client.create(RestInterface.class); 
    } 
    return mInterface; 
} 

public interface RestInterface { 
    @GET("/bins/15oqx") 
    Call<AudioReturn> audioReturn(); 

} 

verwendet Adapter wie diese`

public class AudioAdapter extends 
RecyclerView.Adapter<AudioAdapter.AudioViewHolder> { 
Context mContext; 
private ArrayList<AudioReturn.data> mAudioReturn = new ArrayList<>(); 

public AudioAdapter(Context context, ArrayList<AudioReturn.data> list) { 
    mContext = context; 
    mAudioReturn = list; 
} 
@Override 
public int getItemCount() { 
    return mAudioReturn.size(); 
} 
@Override 
public void onBindViewHolder(AudioViewHolder holder, int position) { 
    AudioReturn.data current = mAudioReturn.get(position); 

    holder.track.setText(current.getTrack()); 
    holder.trackname.setText(mAudioReturn.get(position).getTrackname()); 
} 
@Override 
public AudioAdapter.AudioViewHolder onCreateViewHolder(ViewGroup viewGroup, int position) { 
    View itemView = LayoutInflater. 
      from(viewGroup.getContext()). 
      inflate(R.layout.view_audio_files, viewGroup, false); 
    return new AudioAdapter.AudioViewHolder(itemView); 
} 
public void updateData(ArrayList<AudioReturn.data> datas) { 
    this.mAudioReturn = datas; 
    notifyDataSetChanged(); 
} 
public class AudioViewHolder extends RecyclerView.ViewHolder { 
    @Bind(R.id.view_audio_file_Track_Number) 
    TextView track; 
    @Bind(R.id.view_audio_file_Audio_Name) 
    TextView trackname; 
    public AudioViewHolder(View itemView) { 
     super(itemView); 
     ButterKnife.bind(this, itemView); 
    } 
} 
ist

und der Pojo ist `öffentliche Klasse AudioReturn { ArrayList dataList = neue ArrayList <>();

public class data { 
    String track, trackname; 

    public data(String track, String trackname) { 
     this.track = track; 
     this.trackname = trackname; 
    } 

    public String getTrack() { 
     return track; 
    } 

    public String getTrackname() { 
     return trackname; 
    } 
} 
public AudioReturn(ArrayList<data> dataList) { 
    this.dataList = dataList; 
} 

    public ArrayList<data> getDataList() { 
    return dataList; 
} 

Das Ergebnis, das ich bekomme, ist leer. Ich rufe von der Tätigkeit:

AudioAdapter mAudioAdapter = new AudioAdapter(this, datas); 
    mRecyclerView.setLayoutManager(new LinearLayoutManager(this)); 
    mRecyclerView.setHasFixedSize(true); 
    mRecyclerView.setAdapter(mAudioAdapter); 

    RestClient.RestInterface restInterface = RestClient.getClient(); 

    Call<AudioReturn> audioReturnCall = restInterface.audioReturn(); 
    audioReturnCall.enqueue(new Callback<AudioReturn>() { 
     @Override 
     public void onResponse(Response<AudioReturn> response) { 
      datas = response.body().getDataList(); 
      mAudioAdapter.updateData(datas); 
      Toast.makeText(AudioActivity.this, "Success", Toast.LENGTH_SHORT).show(); 

     } 

     @Override 
     public void onFailure(Throwable t) { 
      Toast.makeText(AudioActivity.this, "Failure", Toast.LENGTH_SHORT).show(); 
     } 
    }); 
}` 

Antwort

0

In Ihrem json die Liste der Tracks wird data genannt. Aber in Ihrer Klasse AudioReturn nennen Sie es dataList, ändern Sie es in data und es sollte funktionieren.

bearbeiten

Ihre Datenklasse ersetzen durch:

public class Data { 
    // The fields names should be exactly equal to the one of the json 
    private String track; 
    private String trackName; 

    // Retrofit needs a default constructor 
    public Data() { 
    } 

    public Data(String track, String trackName) { 
     this.track = track; 
     this.trackName = trackName; 
    } 

    // Retrofit needs getters and setters for each field 
    public String getTrack() { 
     return track; 
    } 

    public void setTrack(String track) { 
     this.track = track; 
    } 

    public String getTrackName() { 
     return trackName; 
    } 

    public void setTrackName(String trackName) { 
     this.trackName = trackName; 
    } 
} 

Und Ihre AudioReturn Klasse:

public class AudioReturn { 
    // The fields names should be exactly equal to the one of the json 
    private List<Data> data; 

    // Retrofit needs a default constructor 
    public AudioReturn() { 
    } 

    public AudioReturn(List<Data> data) { 
     this.data = data; 
    } 

    // Retrofit needs getters and setters for each field 
    public List<Data> getData() { 
     return data; 
    } 

    public void setData(List<Data> data) { 
     this.data = data; 
    } 
} 
+0

Warum i-URL von Audio-Dateien bin nicht bekommen. Gibt es noch andere Methoden? –

+0

Damit es richtig funktioniert, benötigen Sie: –

+0

Für Ihre Klassen AudioReturn und Data: ein Standardkonstruktor und Getter und Setter für jedes Feld. –

Verwandte Themen