【问题标题】:Why is my app not showing data, being fetched in JSON from an API, using retrofit, in recyclerview in android?为什么我的应用程序不显示数据,从 API 以 JSON 格式获取,使用改造,在 android 的 recyclerview 中?
【发布时间】:2017-03-01 05:40:39
【问题描述】:

首先,让我告诉你,我是 android 开发的初学者。我一直在开发一个音乐流应用程序,它从 API 获取 JSON 格式的数据。我正在使用 retrofit2 作为 HTTP 客户端和用于 JSON 解析的 GSON 库。

所以我正在研究一种获取 TopArtist 信息的 API 方法。以下是类和布局:

MainActicity.java:这是主要活动

package com.example.myapplication;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.StaggeredGridLayoutManager;
import android.util.Log;
import com.example.myapplication.APIServices.API_Service;
import com.example.myapplication.Models.Artist;
import com.example.myapplication.Models.LastAPIRecyclerViewAdapter;
import java.util.List;
import butterknife.Bind;
import butterknife.ButterKnife;
import retrofit.Call;
import retrofit.Callback;
import retrofit.GsonConverterFactory;
import retrofit.Response;
import retrofit.Retrofit;

public class MainActivity extends AppCompatActivity {

    public static final String API_Url = "http://ws.audioscrobbler.com/2.0/";
    public static final String API_Key = "//my API-key";

    @Bind(R.id.recyclerView)
    RecyclerView recyclerView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        ButterKnife.bind(this);

        StaggeredGridLayoutManager mStaggeredGridLayoutManager = new StaggeredGridLayoutManager(1, StaggeredGridLayoutManager.VERTICAL);
        recyclerView.setLayoutManager(mStaggeredGridLayoutManager);

        Retrofit retrofit = new Retrofit.Builder()
            .baseUrl(API_Url)
            .addConverterFactory(GsonConverterFactory.create())
            .build();

        API_Service api_service = retrofit.create(API_Service.class);
        Call<List<Artist>> call = api_service.getTopArtist();

        call.enqueue(new Callback<List<Artist>>() {
            @Override
            public void onResponse(Response<List<Artist>> response, Retrofit retrofit)      
            {
                List<Artist> artist = response.body();
                Log.d("Artist", "onResponse: " + response.code());
                LastAPIRecyclerViewAdapter lastAPIRecyclerViewAdapter = new LastAPIRecyclerViewAdapter(artist);
                recyclerView.setAdapter(lastAPIRecyclerViewAdapter);
            }
            @Override
            public void onFailure(Throwable t) 
            {
                Log.d("Artist", "onFailure: " + t.getMessage());
            }
        });
    }
}

APIService.java:

import com.example.myapplication.MainActivity;
import com.example.myapplication.Models.Artist;
import java.util.List;
import retrofit.Call;
import retrofit.http.GET;

public interface API_Service {
    @GET("?method=tag.gettoptracks&tag=pop&api_key=" + MainActivity.API_Key + "&format=json")
    Call<List<Artist>> getTopArtist();
}

Artist.java:这是 Model/POJO 类,它将存储从 API 的 GET 请求中获取的所有数据。

import java.util.ArrayList;
import java.util.List;
import javax.annotation.Generated;
import com.google.gson.annotations.Expose;
import com.google.gson.annotations.SerializedName;

@Generated("org.jsonschema2pojo")
public class Artist {
    @SerializedName("name")
    @Expose
    private String name;
    @SerializedName("mbid")
    @Expose
    private String mbid;
    @SerializedName("url")
    @Expose
    private String url;
    @SerializedName("streamable")
    @Expose
    private String streamable;
    @SerializedName("image")
    @Expose
    private List<Image> image = new ArrayList<Image>();
    @SerializedName("@attr")
    @Expose
    private Attr attr;

    /**
    * 
    * @return
    * The name
    */
    public String getName() {
        return name;
    }

    /**
    * 
    * @param name
    * The name
    */
    public void setName(String name) {
        this.name = name;
    }

    /**
    * 
    * @return
    * The mbid
    */
    public String getMbid() {
        return mbid;
    }

    /**
    * 
    * @param mbid
    * The mbid
    */
    public void setMbid(String mbid) {
        this.mbid = mbid;
    }

    /**
    * 
    * @return
    * The url
    */
    public String getUrl() {
        return url;
    }

    /**
    * 
    * @param url
    * The url
    */
    public void setUrl(String url) {
        this.url = url;
    }

    /**
    * 
    * @return
    * The streamable
    */
    public String getStreamable() {
        return streamable;
    }

    /**
    * 
    * @param streamable
    * The streamable
    */
    public void setStreamable(String streamable) {
        this.streamable = streamable;
    }

    /**
    * 
    * @return
    * The image
    */
    public List<Image> getImage() {
        return image;
    }

    /**
    * 
    * @param image
    * The image
    */
    public void setImage(List<Image> image) {
        this.image = image;
    }

    /**
    * 
    * @return
    * The attr
    */
    public Attr getAttr() {
        return attr;
    }

    /**
    * 
    * @param attr
    * The @attr
    */
    public void setAttr(Attr attr) {
        this.attr = attr;
    }
}

LastAPIRecyclerViewAdapter.java:

import android.support.v7.widget.CardView;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import com.example.myapplication.R;
import java.util.List;
import butterknife.Bind;
import butterknife.ButterKnife;

public class LastAPIRecyclerViewAdapter extends RecyclerView.Adapter<LastAPIRecyclerViewAdapter.LastAPIRecyclerViewHolder>{

    private List<Artist> artists;

    public LastAPIRecyclerViewAdapter(List<Artist> _artist) {
        this.artists = _artist;
    }

    @Override
    public LastAPIRecyclerViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View viewItem = LayoutInflater.from(parent.getContext()).inflate(R.layout.custom_cardview, parent, false);
        return new LastAPIRecyclerViewHolder(viewItem);
    }

    @Override
    public void onBindViewHolder(LastAPIRecyclerViewHolder holder, int position) {
        holder.title.setText(artists.get(position).getName());
    }

    @Override
    public int getItemCount() {
        return 0;
    }

    class LastAPIRecyclerViewHolder extends RecyclerView.ViewHolder{

        @Bind(R.id.cardView)
        CardView cardView;

        @Bind(R.id.textView)
        TextView title;

        @Bind(R.id.imageView)
        ImageView image;

        LastAPIRecyclerViewHolder(View itemView) {
            super(itemView);
            ButterKnife.bind(this, itemView);
        }
    }
}

custom_cardview.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:orientation="horizontal"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@android:color/transparent">

    <android.support.v7.widget.CardView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/cardView"
        app:cardElevation="2dp">

        <ImageView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:id="@+id/imageView"
            android:contentDescription="ImageView of the Recycler View" />

        <TextView
            android:text="TextView"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:id="@+id/textView" />

    </android.support.v7.widget.CardView>

</LinearLayout>

activity_main:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:orientation="vertical"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.example.myapplication.MainActivity">

    <android.support.v7.widget.RecyclerView
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:id="@+id/recyclerView">

    </android.support.v7.widget.RecyclerView>
</LinearLayout>

因此,每当我运行此应用程序时,它都不会显示任何视图。只是一个空白的活动。我哪里做错了?

【问题讨论】:

  • public int getItemCount() { return 0; } 你觉得有什么用?

标签: java android json api retrofit


【解决方案1】:

需要更新这个以返回列表的长度

@Override
public int getItemCount() {
    return 0;
}

据我所知,其他一切正常

【讨论】:

  • 它似乎没有从 API 获得响应,或者无法正确序列化它们。 ???
  • 嗯,它是什么? Log.d("Artist", "onResponse: " + response.code()); 应该会告诉您是否收到任何回复
【解决方案2】:

记得检查“艺术家”是否有值并返回它的大小。

你应该添加这样的东西:

@Override
public int getItemCount() {
    return (null != artist ? artist.size() : 0);
}

【讨论】:

  • 不。还是一样。看起来它没有得到端点的响应。你怎么看?
  • 嘿检查响应是否成功:response.isSuccessful(); 你有一个应该如何响应的例子吗?
猜你喜欢
  • 1970-01-01
  • 2021-07-10
  • 2019-06-12
  • 1970-01-01
  • 2020-04-14
  • 1970-01-01
  • 2015-10-29
  • 1970-01-01
  • 2013-12-06
相关资源
最近更新 更多