2016-12-11 35 views
1

我是ANdroid的新手,這是我對Retrofit的第一次測試。我使用Retofit調用API,如下所示。 我的問題是我運行應用程序時出現空白屏幕。我想在列表中顯示音頻文件,然後播放選定的音頻。我的API是這樣的:enter image description here使用Retrofit調用API

我使用改造調用這個API。這是RESTClient實現和RestInterface我使用`什麼用

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(); 

} 

適配器是這個樣子`

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

並且Pojo是`public class AudioReturn {ArrayList dataList = new 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; 
} 

我得到的結果是空白的。我打電話從一個活動:

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(); 
     } 
    }); 
}` 

回答

0

在你的JSON的曲目列表被稱爲data。 但是在你的班級AudioReturn你叫它dataList,改爲data它應該工作。

編輯

通過更換您的數據類:

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

而且你AudioReturn類:

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

爲什麼我沒有得到的音頻文件的URL。還有其他方法嗎? –

+0

要使其正常工作,您需要: –

+0

對於您的類AudioReturn和Data:默認構造函數以及每個字段的getters和setter。 –