java - 使用 JSON 将对象放入 recyclerview

标签 java android

我正在尝试使用 JSON 将图像插入回收器 View 中。看起来信息正在被读取,但它永远不会停止,最终给我一个内存不足的异常。跟踪显示后台粘性并发标记扫描 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);
    }
}

最佳答案

我看到几个问题:看起来您正在尝试使用 Gson 直接填充 ImageView:

public class Animal {
    private ImageView  picture;

这是行不通的,因为无论 picture 属性采用什么格式,都与 ImageView 的内部实现不兼容(并且内部实现可能会在没有更改的情况下发生更改)警告)。

但是您的 onResponse 中有一个更根本的问题 - 您的条件被颠倒了:

if (!response.isSuccessful()) {

您仅在响应成功时添加项目,而不是在响应成功时添加项目。

除此之外,根据代码的其余部分,您可能需要使用适配器上的 notify... 方法之一来通知 RecyclerView 有关新项目的信息。

关于java - 使用 JSON 将对象放入 recyclerview,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61413765/

相关文章:

java - JVM 基准测试应用程序

java - 无法在 Android 中使用 BroadcastReceiver 上下文初始化接口(interface)

Android 应用程序不会在低于 targetSDKVersion 的版本上启动

java - 如何在 JFrame 中分隔面板以分隔类

java - 如果正则表达式包含所有字母且整个字符串中仅包含 2 个大写字母,则返回行

java - 具体类不使用通用标识符编译

Java,随机选择并插入

android - "react-native start"有效,但在 "react-native run-android"正在进行时崩溃,即使在新项目上也是如此(裸工作流)

android - AChartEngine 条形图中的描边

android - 使用特定于 fragment 的 "adjustPan"或 "adjustResize"