Recyclerview 没有填充 JSON 和 Retrofit?
Posted
技术标签:
【中文标题】Recyclerview 没有填充 JSON 和 Retrofit?【英文标题】:Recycleview not populated with JSON and Retrofit? 【发布时间】:2020-09-20 22:34:05 【问题描述】:我正在制作一个简单的应用程序,用户可以在其中使用 google.com book api 按名称搜索书籍。现在,我希望提供一份以 android 为名的书籍清单。我正在使用 Retrofit2 和 RecycleView,但没有显示任何内容。 主要活动:
public class MainActivity extends AppCompatActivity
RecyclerView recyclerView;
KnjigaAdapter knjigaAdapter;
List<KnjigaModel> listaKnjiga;
public static final String BASE_URL = "https://www.googleapis.com/books/";
@Override
protected void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
uzmiKomentare();
public void uzmiKomentare()
Gson gson = new GsonBuilder().serializeNulls().create();
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(BASE_URL)
.addConverterFactory(GsonConverterFactory.create(gson))
.build();
KnjigaApi knjigaApi = retrofit.create(KnjigaApi.class);
final Call<KnjigaModel> pozivZaListuKnjiga = knjigaApi.getKnjige("android");
pozivZaListuKnjiga.enqueue(new Callback<KnjigaModel>()
@Override
public void onResponse(Call<KnjigaModel> call, Response<KnjigaModel> response)
if (!response.isSuccessful())
return;
//generateRecycleView(WHAT TO PUT HERE!!!!);
@Override
public void onFailure(Call<KnjigaModel> call, Throwable t)
Log.d("MainActivity:", t.getMessage());
);
private void generateRecycleView(List<KnjigaModel> knjige)
listaKnjiga = new ArrayList<>();
recyclerView = findViewById(R.id.recycleview);
knjigaAdapter = new KnjigaAdapter(this, knjige);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
recyclerView.setAdapter(knjigaAdapter);
if (knjigaAdapter.getItemCount() == 0)
Log.i("List is empty: ","YES");
else
Log.i("list is empty: ","No");
api接口:
public interface KnjigaApi
@GET("v1/volumes")
Call<KnjigaModel> getKnjige(@Query("q") String knjiga);
模型类:
public class KnjigaModel
@SerializedName("title")
@Expose
private String imeKnjige;
@SerializedName("authors")
@Expose
private String imeAutora;
@SerializedName("thumbnail")
@Expose
private String slikaKnjige;
public KnjigaModel(String imeKnjige, String imeAutora,String slikaKnjige)
this.imeKnjige = imeKnjige;
this.imeAutora = imeAutora;
this.slikaKnjige = slikaKnjige;
public String getImeKnjige()
return imeKnjige;
public String getImeAutora()
return imeAutora;
public String getSlikaKnjige()
return slikaKnjige;
和我的适配器:
public class KnjigaAdapter extends RecyclerView.Adapter<KnjigaAdapter.KomentariViewHolder>
private List<KnjigaModel> listaKnjiga;
private LayoutInflater inflater;
private Context context;
public KnjigaAdapter(Context context, List<KnjigaModel> listaKnjiga)
this.listaKnjiga = listaKnjiga;
this.context = context;
@Override
public KomentariViewHolder onCreateViewHolder(ViewGroup parent, int viewType)
inflater = LayoutInflater.from(context);
// Inflate the custom layout
View postView = inflater.inflate(R.layout.single_item, parent, false);
// Return a new holder instance
return new KomentariViewHolder(postView);
@Override
public void onBindViewHolder(KomentariViewHolder holder, int position)
KnjigaModel knjige = listaKnjiga.get(position);
holder.naslovKnjige.setText(knjige.getImeKnjige());
holder.imeAutora.setText(knjige.getImeAutora());
Glide.with(context)
.load(knjige.getSlikaKnjige())
.into(holder.slikaKnjige);
@Override
public int getItemCount()
return listaKnjiga.size();
public class KomentariViewHolder extends RecyclerView.ViewHolder
private TextView naslovKnjige;
private TextView imeAutora;
private ImageView slikaKnjige;
public KomentariViewHolder(View itemView)
super(itemView);
naslovKnjige = itemView.findViewById(R.id.ime_knjige);
imeAutora = itemView.findViewById(R.id.autor_knjige);
slikaKnjige = itemView.findViewById(R.id.sika_korica);
我的 JSON 格式:
https://www.googleapis.com/books/v1/volumes?q=android
【问题讨论】:
【参考方案1】:首先,我强烈建议将 RxJava 用于异步请求,尽管它是完全可选的。
您的问题:
你的“getKnjige”方法只返回一个模型,虽然端点被命名为volumes(复数),你需要将你的KnjigaModel包装在一个像data class KnjigaResponse(val items: List<KnjigaModel>)
这样的类中
(Kotlin 为简单起见,您还可以生成一个 Java 类,其中包含一个包含 KnjigaModel 列表的单个成员 volumes 成员)
另外,你的模型是错误的。 authors 不是一个字符串,而是一个字符串列表,“thumbnail”被包裹在一个“imageLinks”对象中, title 被包裹在一个 volumeInfo 对象中。
您的改造界面将如下所示:
public interface KnjigaApi
@GET("v1/volumes")
Call<KnjigaResponse> getKnjige(@Query("q") String knjiga);
要求:
final Call<KnjigaResponse> pozivZaListuKnjiga = knjigaApi.getKnjige("android");
pozivZaListuKnjiga.enqueue(new Callback<KnjigaResponse>()
@Override
public void onResponse(Call<KnjigaResponse> call, Response<KnjigaResponse> response)
if (!response.isSuccessful())
return;
generateRecycleView(response.items);
@Override
public void onFailure(Call<KnjigaResponse> call, Throwable t)
Log.d("MainActivity:", t.getMessage());
);
【讨论】:
以上是关于Recyclerview 没有填充 JSON 和 Retrofit?的主要内容,如果未能解决你的问题,请参考以下文章
RecyclerView没有被来自firebase的项目填充,只是一个空白的活动页面。
为啥我的 RecyclerView 没有填充来自改造的数据?