java - 使用 JSON 将对象放入 recyclerview
问题描述
我正在尝试使用 JSON 将图像插入到回收站视图中。似乎正在读取信息,但它永远不会停止并最终给我一个内存不足的异常。跟踪显示背景粘性并发标记扫描 GC 一遍又一遍地释放了大约 2 分钟,然后引发错误。我不清楚这里的真正错误,否则我会提供更多信息,如果您需要,请提出问题以进行澄清。
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("https://dog.ceo/api/breeds/image/random/")
.addConverterFactory(GsonConverterFactory.create())
.build();
JsonAnimalApi jsonAnimalApi = retrofit.create(JsonAnimalApi.class);
Call<Animal> call = jsonAnimalApi.getAnimals();
System.out.println("Here");
call.enqueue(new Callback<Animal>() {
@Override
public void onResponse(Call<Animal> call, Response<Animal> response) {
System.out.println("HERE");
if (response.isSuccessful()) {
while (names.size() < 50) names.add(response.body().getPicture());
tvResponse.setText("Code: " + response.code());
return;
}
RecyclerView recyclerView = rootView.findViewById(R.id.recycler_view);
RecyclerViewAdapter rAdapter = new RecyclerViewAdapter(names, this);
recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
recyclerView.setAdapter(rAdapter);
public interface JsonAnimalApi {
@GET("animals")
Call<Animal> getAnimals();
}
public class Animal {
private ImageView picture;
private String status;
private String message;
public ImageView getPicture() {
return picture;
}
public String getStatus() {
return status;
}
public String getMessage() {
return message;
}
}
public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.ViewHolder> {
private ArrayList<ImageView> mAnimalNames;
private OnNoteListener mOnNote;
public RecyclerViewAdapter(ArrayList<ImageView> mAnimalNames, OnNoteListener mOnNote) {
this.mAnimalNames = mAnimalNames;
this.mOnNote = mOnNote;
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.layout_listitem, parent, false);
ViewHolder holder = new ViewHolder(view, mOnNote);
return holder;
}
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
Log.d(TAG, "onBindViewHolder: ");
}
@Override
public int getItemCount() {
return mAnimalNames.size();
}
public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
ImageView animalName;
OnNoteListener onNote;
public ViewHolder(@NonNull View itemView, OnNoteListener onNote) {
super(itemView);
animalName = itemView.findViewById(R.id.animal_name);
this.onNote = onNote;
itemView.setOnClickListener(this);
}
@Override
public void onClick(View view) {
mOnNote.onNoteClick(getAdapterPosition(), mAnimalNames);
}
}
public interface OnNoteListener {
void onNoteClick(int pos, ArrayList<ImageView> names);
}
}
解决方案
我看到了几个问题:看起来您正在尝试使用 GsonImageView
直接填写:
public class Animal {
private ImageView picture;
这是行不通的,因为picture
属性的任何格式都与 's 的内部实现不兼容ImageView
(并且内部实现可能会在没有警告的情况下更改)。
但是你有一个更根本的问题onResponse
- 你的条件被颠倒了:
if (!response.isSuccessful()) {
只有在响应不成功时才添加项目,而不是在响应成功时添加项目。
除此之外,根据您的其余代码,您可能需要使用notify...
适配器上的一种方法来通知 RecyclerView 新项目。
推荐阅读
- ubuntu - 使用 Gnome Ubuntu 安装和运行 XRDP(远程桌面)时出错:我遇到黑屏
- android - 每个应用每 15 分钟一次 setAndAllowWhileIdle() 和 setExactAndAllowWhileIdle() 一次。每分钟报警怎么办
- php - 从 JSON 响应中的键中获取值
- excel - 使用 IFNA() 函数导出 Google 表格会给出#name?Excel中的错误
- linux - 尽管 CONFIG_COMPAT 在 aarch64 上运行 32 位 ARM 二进制文件仍无法正常工作
- git - 在单个主机上使用多个密钥时 SSH 使用错误的密钥
- ios - 为什么我在使用该值时得到一个 nil 值,但是当我打印它时它显示为 none nil?
- reactjs - 反应,使用道具将数据从孩子传递给父母
- php - 我如何在 laravel eloquent 中编写这个 sql
- java - 谷歌地图在Android的标签片段上显示为灰色