JSON 在 Android 上使用 Retrofit 的响应
JSON Response Using Retrofit on Android
我可以使用 OkHttp3 获得 JSON 响应,我想使用 Retrofit 来解析响应以从中获取名称和图像。我查看了 Retrofit 网站和一些教程,但仍然不清楚过程。
这是我获得 JSON 响应的 OkHttp3 代码:
Request request = new Request.Builder().url(url).build();
client.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
e.printStackTrace();
}
@Override
public void onResponse(Call call, Response response) throws IOException {
if (!response.isSuccessful()) throw new IOException("Unexpected code " + response);
Headers responseHeaders = response.headers();
for (int i = 0, size = responseHeaders.size(); i < size; i++) {
System.out.println(responseHeaders.name(i) + responseHeaders.value(i));
}
System.out.println(response.body().string());
String jData = response.body().string();// I want to parse jData using Retrofit
}
});
JSON 响应如下所示:
我想得到每个艺术家的名字、id 和图像,非常感谢任何帮助。
更新
我添加了 Pojo class其中之一是项目 class:
public class Item {
@SerializedName("external_urls")
@Expose
private ExternalUrls externalUrls;
@SerializedName("followers")
@Expose
private Followers followers;
@SerializedName("genres")
@Expose
private List<Object> genres = new ArrayList<Object>();
@SerializedName("href")
@Expose
private String href;
@SerializedName("id")
@Expose
private String id;
@SerializedName("images")
@Expose
private List<Object> images = new ArrayList<Object>();
@SerializedName("name")
@Expose
private String name;
@SerializedName("popularity")
@Expose
private Integer popularity;
@SerializedName("type")
@Expose
private String type;
@SerializedName("uri")
@Expose
private String uri;
/**
*
* @return
* The externalUrls
*/
public ExternalUrls getExternalUrls() {
return externalUrls;
}
/**
*
* @param externalUrls
* The external_urls
*/
public void setExternalUrls(ExternalUrls externalUrls) {
this.externalUrls = externalUrls;
}
/**
*
* @return
* The followers
*/
public Followers getFollowers() {
return followers;
}
/**
*
* @param followers
* The followers
*/
public void setFollowers(Followers followers) {
this.followers = followers;
}
/**
*
* @return
* The genres
*/
public List<Object> getGenres() {
return genres;
}
/**
*
* @param genres
* The genres
*/
public void setGenres(List<Object> genres) {
this.genres = genres;
}
/**
*
* @return
* The href
*/
public String getHref() {
return href;
}
/**
*
* @param href
* The href
*/
public void setHref(String href) {
this.href = href;
}
/**
*
* @return
* The id
*/
public String getId() {
return id;
}
/**
*
* @param id
* The id
*/
public void setId(String id) {
this.id = id;
}
/**
*
* @return
* The images
*/
public List<Object> getImages() {
return images;
}
/**
*
* @param images
* The images
*/
public void setImages(List<Object> images) {
this.images = images;
}
/**
*
* @return
* The name
*/
public String getName() {
return name;
}
/**
*
* @param name
* The name
*/
public void setName(String name) {
this.name = name;
}
/**
*
* @return
* The popularity
*/
public Integer getPopularity() {
return popularity;
}
/**
*
* @param popularity
* The popularity
*/
public void setPopularity(Integer popularity) {
this.popularity = popularity;
}
/**
*
* @return
* The type
*/
public String getType() {
return type;
}
/**
*
* @param type
* The type
*/
public void setType(String type) {
this.type = type;
}
/**
*
* @return
* The uri
*/
public String getUri() {
return uri;
}
/**
*
* @param uri
* The uri
*/
public void setUri(String uri) {
this.uri = uri;
}
}
下面是我在 activity 中使用 Retrofit 的方式:
private void loadJSON() {
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("https://api.spotify.com")
.addConverterFactory(GsonConverterFactory.create())
.build();
final Artists_Interface request = retrofit.create(Artists_Interface.class);
Call<Item> call = request.getArtists();
call.enqueue(new Callback<Item>() {
@Override
public void onResponse(Call<Item> call, Response<Item> response) {
if(response.isSuccessful()){
Item artist = response.body();
System.out.println("THE NAME::::. : " + artist.getName());
}
else{
System.out.println(" :::. NOO RESPONSE .::: " );
}
}
@Override
public void onFailure(Call<Item> call, Throwable t) {
System.out.println("onFAIL::: " + t);
}
});
下面是改装界面的样子:
public interface Artists_Interface {
@GET("/v1/search?q=Beyonce&type=artist")
Call<Item> getArtists();
}
我得到 artist.getName() 等于 null。我需要在 JSON body 中获取 "items" 内的名称、ID 和图像,并将它们传递给 listView 或 recyclerView adapter
这是错误的,
Headers responseHeaders = response.headers();
for (int i = 0, size = responseHeaders.size(); i < size; i++) {
System.out.println(responseHeaders.name(i) + responseHeaders.value(i));
}
您正在尝试在 headers 中查找名称、id 等数据,而 信息在响应的 body 中。
只需为您的数据模型创建一个 POJO,然后从响应中将信息检索到模型中 object。然后你可以简单地使用 getters 和 setters 来访问你需要的数据。
更新
您可以使用此站点轻松创建 POJO,http://www.jsonschema2pojo.org。只需复制并粘贴您的 JSON,它会立即为您生成 POJO。
现在一旦你有了 POJO,你可以手动解析它或者使用 GSON 或 Jackson 库来轻松地完成它。
更新 2
这里错误比较self-explanatory,
Expected BEGIN_ARRAY but was BEGIN_OBJECT at line 1
它清楚地表明解析器需要一个数组,但在实际的 JSON.
中找到了一个 object
看到实际的JSON,它以object而不是数组开头,所以你为什么在这里使用List,
Call<List<Item>> getArtists();
如果您查看 JSON,您会发现它以 object 开头,在其中您有另一个 object 和键 "artists" 然后您有键为 "items".
的项目列表
您也不需要手动执行任何操作。 www.jsonschema2pojo.org 会为您生成所有内容,您只需要包含它们即可。
我不明白你为什么包含一个列表而不是 object。
更新 3
getters 人,简单的 getters。
假设你有这个,假设。
class Data {
Artists artists;
Artists getArtists() {
return artists;
}
class Artists {
List<Item> list;
List<Item> getItemList(){
return list;
}
}
class Item {
// You have your item class here
}
}
现在就这样做,
Call<Data> getArtists();
并获取物品,
data.getArtists().getItemList();
现在清楚了吗?
here里面有简单的演示,请看一下
您可以使用 android JSONObject class 如:
JSONObject json = new JSONObject(response.body().string());
创建对象后,您可以使用 .get()
method 像正常 JSON 一样提取所需的字段。
感谢大家的回答,谢谢大家。由于 Retrofit 的文档很差,我设法通过将各个部分放在一起来解决问题,并且一些答案不够详细,无法接受。我想从这个 link 的 JSON 响应中提取数据:https://api.spotify.com/v1/search?q=Beyonce&type=artist
第一步:
创建一个 Pojo class 来反序列化响应中的项目。反序列化基本上意味着在这个 JSON 响应中,我们有 "artists" 数组,里面有 "href" 字符串和 "items" 列表,所以正如 Aritra 建议的那样,我们可以使用 http://www.jsonschema2pojo.org 生成将为我们反序列化这些项目的 pojo classes。这是我的一些修改后的样子:
public class Data implements Serializable{
@SerializedName("artists")
Artists artists;
public Artists getArtists() {
return artists;
}
public static class Artists {
@SerializedName("href")
private String href;
@SerializedName("items")
private List<Item> items;
public String getHref(){
return href;
}
public List<Item> getItems(){
return items;
}
}// Artists
public static class Item {
// You have your item class here
@SerializedName("external_urls")
@Expose
private ExternalUrls externalUrls;
@SerializedName("followers")
@Expose
private Followers followers;
@SerializedName("genres")
@Expose
private List<Object> genres = new ArrayList<Object>();
@SerializedName("href")
@Expose
private String href;
@SerializedName("id")
@Expose
private String id;
@SerializedName("images")
@Expose
private List<Object> images = new ArrayList<Object>();
@SerializedName("name")
@Expose
private String name;
@SerializedName("popularity")
@Expose
private Integer popularity;
@SerializedName("type")
@Expose
private String type;
@SerializedName("uri")
@Expose
private String uri;
public Item() {
name = "";
id = "";
images = new ArrayList<>();
}
/**
* @return The externalUrls
*/
public ExternalUrls getExternalUrls() {
return externalUrls;
}
/**
* @param externalUrls The external_urls
*/
public void setExternalUrls(ExternalUrls externalUrls) {
this.externalUrls = externalUrls;
}
/**
* @return The followers
*/
public Followers getFollowers() {
return followers;
}
/**
* @param followers The followers
*/
public void setFollowers(Followers followers) {
this.followers = followers;
}
/**
* @return The genres
*/
public List<Object> getGenres() {
return genres;
}
/**
* @param genres The genres
*/
public void setGenres(List<Object> genres) {
this.genres = genres;
}
/**
* @return The href
*/
public String getHref() {
return href;
}
/**
* @param href The href
*/
public void setHref(String href) {
this.href = href;
}
/**
* @return The id
*/
public String getId() {
return id;
}
/**
* @param id The id
*/
public void setId(String id) {
this.id = id;
}
/**
* @return The images
*/
public List<Object> getImages() {
return images;
}
/**
* @param images The images
*/
public void setImages(List<Object> images) {
this.images = images;
}
/**
* @return The name
*/
public String getName() {
return name;
}
/**
* @param name The name
*/
public void setName(String name) {
this.name = name;
}
/**
* @return The popularity
*/
public Integer getPopularity() {
return popularity;
}
/**
* @param popularity The popularity
*/
public void setPopularity(Integer popularity) {
this.popularity = popularity;
}
/**
* @return The type
*/
public String getType() {
return type;
}
/**
* @param type The type
*/
public void setType(String type) {
this.type = type;
}
/**
* @return The uri
*/
public String getUri() {
return uri;
}
/**
* @param uri The uri
*/
public void setUri(String uri) {
this.uri = uri;
}
}// Item
}
因此,表示为艺术家 class 的数组 "artists" 包含 href 字符串和项目列表元素,所有元素都序列化以匹配 JSON 响应。 items 列表的类型为 Item class,其中包含许多序列化元素,如 id、name、images.. 等。所有这些元素都被序列化以处理 JSON 响应。
第二步:
url 分为两部分,一个基数和一个端点。我们在创建 Retrofit2 请求时使用基础。我从 onCreate 方法调用此请求:
private void loadJSON() {
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("https://api.spotify.com")
.addConverterFactory(GsonConverterFactory.create())
.build();
final Artists_Interface request = retrofit.create(Artists_Interface.class);
Call<Data> call = request.getArtists();
call.enqueue(new Callback<Data>() {
@Override
public void onResponse(Call<Data> call, Response<Data> response) {
if (response.isSuccessful()) {
System.out.println(" Href ::::. : " + response.body().getArtists().getHref());
List<Data.Item> items = response.body().getArtists().getItems();
for (int i = 0; i < items.size(); i++) {
adapter.addArtist(items.get(i));
}
}
else { System.out.println(" :::. NO RESPONSE .::: "); }
}// End onResponse
@Override
public void onFailure(Call<Data> call, Throwable t) {
System.out.println("onFAIL::: " + t);
}
});
然后,我们使用Retrofit2接口中的端点class:
public interface Artists_Interface {
@GET("/v1/search?q=Beyonce&type=artist")
Call<Data> getArtists();
}
第三步:
只需将我们从响应中获得的值分配给我们视图中的元素即可。在第二步中,我将项目列表分配给了我的 recyclerView 适配器,所以这里是我的适配器的样子:
public class Artists_Adapter extends RecyclerView.Adapter<Artists_Adapter.ViewHolder> {
private ArrayList<Data.Item> artists;
public Artists_Adapter(ArrayList<Data.Item> artists) {
this.artists = artists;
}
@Override
public Artists_Adapter.ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.row_artists, viewGroup, false);
return new ViewHolder(view);
}
@Override
public void onBindViewHolder(Artists_Adapter.ViewHolder viewHolder, int i) {
viewHolder.name.setText(artists.get(i).getName());
}
@Override
public int getItemCount() {
if(artists == null){
return 0;
}
else {
return artists.size();
}
}
public void addArtist(Data.Item item){
artists.add(item);
}
public class ViewHolder extends RecyclerView.ViewHolder{
private TextView name ;
private ImageView imageView;
public ViewHolder(View view) {
super(view);
name = (TextView)view.findViewById(R.id.name);
imageView = (ImageView) view.findViewById(R.id.image);
}
}
}
这里是我的 onCreate() 方法的样子:
private RecyclerView recyclerView;
private ArrayList<Data.Item> data = new ArrayList<>();
private Artists_Adapter adapter;
static Context ctx;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_search);
ctx = this;
url = "https://api.spotify.com/v1/search?q=Beyonce&type=artist";
loadJSON();
initViews();
}// onCreate
private void initViews() {
recyclerView = (RecyclerView) findViewById(R.id.card_recycler_view);
recyclerView.setHasFixedSize(true);
RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(getApplicationContext());
recyclerView.setLayoutManager(layoutManager);
adapter = new Artists_Adapter(data);
recyclerView.setAdapter(adapter);
}
我可以使用 OkHttp3 获得 JSON 响应,我想使用 Retrofit 来解析响应以从中获取名称和图像。我查看了 Retrofit 网站和一些教程,但仍然不清楚过程。
这是我获得 JSON 响应的 OkHttp3 代码:
Request request = new Request.Builder().url(url).build();
client.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
e.printStackTrace();
}
@Override
public void onResponse(Call call, Response response) throws IOException {
if (!response.isSuccessful()) throw new IOException("Unexpected code " + response);
Headers responseHeaders = response.headers();
for (int i = 0, size = responseHeaders.size(); i < size; i++) {
System.out.println(responseHeaders.name(i) + responseHeaders.value(i));
}
System.out.println(response.body().string());
String jData = response.body().string();// I want to parse jData using Retrofit
}
});
JSON 响应如下所示:
我想得到每个艺术家的名字、id 和图像,非常感谢任何帮助。
更新
我添加了 Pojo class其中之一是项目 class:
public class Item {
@SerializedName("external_urls")
@Expose
private ExternalUrls externalUrls;
@SerializedName("followers")
@Expose
private Followers followers;
@SerializedName("genres")
@Expose
private List<Object> genres = new ArrayList<Object>();
@SerializedName("href")
@Expose
private String href;
@SerializedName("id")
@Expose
private String id;
@SerializedName("images")
@Expose
private List<Object> images = new ArrayList<Object>();
@SerializedName("name")
@Expose
private String name;
@SerializedName("popularity")
@Expose
private Integer popularity;
@SerializedName("type")
@Expose
private String type;
@SerializedName("uri")
@Expose
private String uri;
/**
*
* @return
* The externalUrls
*/
public ExternalUrls getExternalUrls() {
return externalUrls;
}
/**
*
* @param externalUrls
* The external_urls
*/
public void setExternalUrls(ExternalUrls externalUrls) {
this.externalUrls = externalUrls;
}
/**
*
* @return
* The followers
*/
public Followers getFollowers() {
return followers;
}
/**
*
* @param followers
* The followers
*/
public void setFollowers(Followers followers) {
this.followers = followers;
}
/**
*
* @return
* The genres
*/
public List<Object> getGenres() {
return genres;
}
/**
*
* @param genres
* The genres
*/
public void setGenres(List<Object> genres) {
this.genres = genres;
}
/**
*
* @return
* The href
*/
public String getHref() {
return href;
}
/**
*
* @param href
* The href
*/
public void setHref(String href) {
this.href = href;
}
/**
*
* @return
* The id
*/
public String getId() {
return id;
}
/**
*
* @param id
* The id
*/
public void setId(String id) {
this.id = id;
}
/**
*
* @return
* The images
*/
public List<Object> getImages() {
return images;
}
/**
*
* @param images
* The images
*/
public void setImages(List<Object> images) {
this.images = images;
}
/**
*
* @return
* The name
*/
public String getName() {
return name;
}
/**
*
* @param name
* The name
*/
public void setName(String name) {
this.name = name;
}
/**
*
* @return
* The popularity
*/
public Integer getPopularity() {
return popularity;
}
/**
*
* @param popularity
* The popularity
*/
public void setPopularity(Integer popularity) {
this.popularity = popularity;
}
/**
*
* @return
* The type
*/
public String getType() {
return type;
}
/**
*
* @param type
* The type
*/
public void setType(String type) {
this.type = type;
}
/**
*
* @return
* The uri
*/
public String getUri() {
return uri;
}
/**
*
* @param uri
* The uri
*/
public void setUri(String uri) {
this.uri = uri;
}
}
下面是我在 activity 中使用 Retrofit 的方式:
private void loadJSON() {
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("https://api.spotify.com")
.addConverterFactory(GsonConverterFactory.create())
.build();
final Artists_Interface request = retrofit.create(Artists_Interface.class);
Call<Item> call = request.getArtists();
call.enqueue(new Callback<Item>() {
@Override
public void onResponse(Call<Item> call, Response<Item> response) {
if(response.isSuccessful()){
Item artist = response.body();
System.out.println("THE NAME::::. : " + artist.getName());
}
else{
System.out.println(" :::. NOO RESPONSE .::: " );
}
}
@Override
public void onFailure(Call<Item> call, Throwable t) {
System.out.println("onFAIL::: " + t);
}
});
下面是改装界面的样子:
public interface Artists_Interface {
@GET("/v1/search?q=Beyonce&type=artist")
Call<Item> getArtists();
}
我得到 artist.getName() 等于 null。我需要在 JSON body 中获取 "items" 内的名称、ID 和图像,并将它们传递给 listView 或 recyclerView adapter
这是错误的,
Headers responseHeaders = response.headers();
for (int i = 0, size = responseHeaders.size(); i < size; i++) {
System.out.println(responseHeaders.name(i) + responseHeaders.value(i));
}
您正在尝试在 headers 中查找名称、id 等数据,而 信息在响应的 body 中。
只需为您的数据模型创建一个 POJO,然后从响应中将信息检索到模型中 object。然后你可以简单地使用 getters 和 setters 来访问你需要的数据。
更新
您可以使用此站点轻松创建 POJO,http://www.jsonschema2pojo.org。只需复制并粘贴您的 JSON,它会立即为您生成 POJO。
现在一旦你有了 POJO,你可以手动解析它或者使用 GSON 或 Jackson 库来轻松地完成它。
更新 2
这里错误比较self-explanatory,
Expected BEGIN_ARRAY but was BEGIN_OBJECT at line 1
它清楚地表明解析器需要一个数组,但在实际的 JSON.
中找到了一个 object看到实际的JSON,它以object而不是数组开头,所以你为什么在这里使用List,
Call<List<Item>> getArtists();
如果您查看 JSON,您会发现它以 object 开头,在其中您有另一个 object 和键 "artists" 然后您有键为 "items".
的项目列表您也不需要手动执行任何操作。 www.jsonschema2pojo.org 会为您生成所有内容,您只需要包含它们即可。
我不明白你为什么包含一个列表而不是 object。
更新 3
getters 人,简单的 getters。
假设你有这个,假设。
class Data {
Artists artists;
Artists getArtists() {
return artists;
}
class Artists {
List<Item> list;
List<Item> getItemList(){
return list;
}
}
class Item {
// You have your item class here
}
}
现在就这样做,
Call<Data> getArtists();
并获取物品,
data.getArtists().getItemList();
现在清楚了吗?
here里面有简单的演示,请看一下
您可以使用 android JSONObject class 如:
JSONObject json = new JSONObject(response.body().string());
创建对象后,您可以使用 .get()
method 像正常 JSON 一样提取所需的字段。
感谢大家的回答,谢谢大家。由于 Retrofit 的文档很差,我设法通过将各个部分放在一起来解决问题,并且一些答案不够详细,无法接受。我想从这个 link 的 JSON 响应中提取数据:https://api.spotify.com/v1/search?q=Beyonce&type=artist
第一步: 创建一个 Pojo class 来反序列化响应中的项目。反序列化基本上意味着在这个 JSON 响应中,我们有 "artists" 数组,里面有 "href" 字符串和 "items" 列表,所以正如 Aritra 建议的那样,我们可以使用 http://www.jsonschema2pojo.org 生成将为我们反序列化这些项目的 pojo classes。这是我的一些修改后的样子:
public class Data implements Serializable{
@SerializedName("artists")
Artists artists;
public Artists getArtists() {
return artists;
}
public static class Artists {
@SerializedName("href")
private String href;
@SerializedName("items")
private List<Item> items;
public String getHref(){
return href;
}
public List<Item> getItems(){
return items;
}
}// Artists
public static class Item {
// You have your item class here
@SerializedName("external_urls")
@Expose
private ExternalUrls externalUrls;
@SerializedName("followers")
@Expose
private Followers followers;
@SerializedName("genres")
@Expose
private List<Object> genres = new ArrayList<Object>();
@SerializedName("href")
@Expose
private String href;
@SerializedName("id")
@Expose
private String id;
@SerializedName("images")
@Expose
private List<Object> images = new ArrayList<Object>();
@SerializedName("name")
@Expose
private String name;
@SerializedName("popularity")
@Expose
private Integer popularity;
@SerializedName("type")
@Expose
private String type;
@SerializedName("uri")
@Expose
private String uri;
public Item() {
name = "";
id = "";
images = new ArrayList<>();
}
/**
* @return The externalUrls
*/
public ExternalUrls getExternalUrls() {
return externalUrls;
}
/**
* @param externalUrls The external_urls
*/
public void setExternalUrls(ExternalUrls externalUrls) {
this.externalUrls = externalUrls;
}
/**
* @return The followers
*/
public Followers getFollowers() {
return followers;
}
/**
* @param followers The followers
*/
public void setFollowers(Followers followers) {
this.followers = followers;
}
/**
* @return The genres
*/
public List<Object> getGenres() {
return genres;
}
/**
* @param genres The genres
*/
public void setGenres(List<Object> genres) {
this.genres = genres;
}
/**
* @return The href
*/
public String getHref() {
return href;
}
/**
* @param href The href
*/
public void setHref(String href) {
this.href = href;
}
/**
* @return The id
*/
public String getId() {
return id;
}
/**
* @param id The id
*/
public void setId(String id) {
this.id = id;
}
/**
* @return The images
*/
public List<Object> getImages() {
return images;
}
/**
* @param images The images
*/
public void setImages(List<Object> images) {
this.images = images;
}
/**
* @return The name
*/
public String getName() {
return name;
}
/**
* @param name The name
*/
public void setName(String name) {
this.name = name;
}
/**
* @return The popularity
*/
public Integer getPopularity() {
return popularity;
}
/**
* @param popularity The popularity
*/
public void setPopularity(Integer popularity) {
this.popularity = popularity;
}
/**
* @return The type
*/
public String getType() {
return type;
}
/**
* @param type The type
*/
public void setType(String type) {
this.type = type;
}
/**
* @return The uri
*/
public String getUri() {
return uri;
}
/**
* @param uri The uri
*/
public void setUri(String uri) {
this.uri = uri;
}
}// Item
}
因此,表示为艺术家 class 的数组 "artists" 包含 href 字符串和项目列表元素,所有元素都序列化以匹配 JSON 响应。 items 列表的类型为 Item class,其中包含许多序列化元素,如 id、name、images.. 等。所有这些元素都被序列化以处理 JSON 响应。
第二步: url 分为两部分,一个基数和一个端点。我们在创建 Retrofit2 请求时使用基础。我从 onCreate 方法调用此请求:
private void loadJSON() {
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("https://api.spotify.com")
.addConverterFactory(GsonConverterFactory.create())
.build();
final Artists_Interface request = retrofit.create(Artists_Interface.class);
Call<Data> call = request.getArtists();
call.enqueue(new Callback<Data>() {
@Override
public void onResponse(Call<Data> call, Response<Data> response) {
if (response.isSuccessful()) {
System.out.println(" Href ::::. : " + response.body().getArtists().getHref());
List<Data.Item> items = response.body().getArtists().getItems();
for (int i = 0; i < items.size(); i++) {
adapter.addArtist(items.get(i));
}
}
else { System.out.println(" :::. NO RESPONSE .::: "); }
}// End onResponse
@Override
public void onFailure(Call<Data> call, Throwable t) {
System.out.println("onFAIL::: " + t);
}
});
然后,我们使用Retrofit2接口中的端点class:
public interface Artists_Interface {
@GET("/v1/search?q=Beyonce&type=artist")
Call<Data> getArtists();
}
第三步: 只需将我们从响应中获得的值分配给我们视图中的元素即可。在第二步中,我将项目列表分配给了我的 recyclerView 适配器,所以这里是我的适配器的样子:
public class Artists_Adapter extends RecyclerView.Adapter<Artists_Adapter.ViewHolder> {
private ArrayList<Data.Item> artists;
public Artists_Adapter(ArrayList<Data.Item> artists) {
this.artists = artists;
}
@Override
public Artists_Adapter.ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.row_artists, viewGroup, false);
return new ViewHolder(view);
}
@Override
public void onBindViewHolder(Artists_Adapter.ViewHolder viewHolder, int i) {
viewHolder.name.setText(artists.get(i).getName());
}
@Override
public int getItemCount() {
if(artists == null){
return 0;
}
else {
return artists.size();
}
}
public void addArtist(Data.Item item){
artists.add(item);
}
public class ViewHolder extends RecyclerView.ViewHolder{
private TextView name ;
private ImageView imageView;
public ViewHolder(View view) {
super(view);
name = (TextView)view.findViewById(R.id.name);
imageView = (ImageView) view.findViewById(R.id.image);
}
}
}
这里是我的 onCreate() 方法的样子:
private RecyclerView recyclerView;
private ArrayList<Data.Item> data = new ArrayList<>();
private Artists_Adapter adapter;
static Context ctx;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_search);
ctx = this;
url = "https://api.spotify.com/v1/search?q=Beyonce&type=artist";
loadJSON();
initViews();
}// onCreate
private void initViews() {
recyclerView = (RecyclerView) findViewById(R.id.card_recycler_view);
recyclerView.setHasFixedSize(true);
RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(getApplicationContext());
recyclerView.setLayoutManager(layoutManager);
adapter = new Artists_Adapter(data);
recyclerView.setAdapter(adapter);
}