Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/370.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用JSON将对象放入recyclerview_Java_Android - Fatal编程技术网

Java 使用JSON将对象放入recyclerview

Java 使用JSON将对象放入recyclerview,java,android,Java,Android,我正在尝试使用JSON将图像插入到回收器视图中。看起来信息正在被读取,但它从未停止,最终导致内存不足异常。跟踪显示背景粘性并发标记扫描GC反复释放了大约2分钟,然后抛出错误。我不清楚这里的真正错误,否则我会提供更多信息,如果您需要,请询问问题以澄清 Retrofit retrofit = new Retrofit.Builder() .baseUrl("https://dog.ceo/api/breeds/image/random/")

我正在尝试使用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);
公共类RecycleServiceAdapter扩展了RecyclerView.Adapter{
私人ArrayList mAnimalNames;
私有onnote;
公共回收服务适配器(ArrayList mAnimalNames、OnNoteListener mOnNote){
this.mAnimalNames=mAnimalNames;
this.mOnNote=mOnNote;
}
@非空
@凌驾
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent,int viewType){
View View=LayoutInflater.from(parent.getContext()).flate(R.layout.layout\u listitem,parent,false);
ViewHolder=新的ViewHolder(视图,mOnNote);
报税表持有人;
}
@凌驾
public void onBindViewHolder(@NonNull ViewHolder,int位置){
Log.d(标签“onBindViewHolder:”);
}
@凌驾
public int getItemCount(){
返回mAnimalNames.size();
}
公共类ViewHolder扩展了RecyclerView.ViewHolder实现了View.OnClickListener{
ImageView动物名;
onNote监听器onNote;
public ViewHolder(@NonNull View itemView,OnNoteListener onNote){
超级(项目视图);
animalName=itemView.findviewbyd(R.id.animal\u name);
this.onNote=onNote;
setOnClickListener(这个);
}
@凌驾
公共void onClick(视图){
onnote.onNoteClick(getAdapterPosition(),mAnimalNames);
}
}
公共接口OnNoteListener{
void onNoteClick(int pos,ArrayList名称);
}
}

我发现了几个问题:看起来您正试图使用Gson直接填写
图像视图

公共类动物{
私人影像查看图片;
这是行不通的,因为
picture
属性所采用的任何格式都与
ImageView
的内部实现不兼容(该内部实现可能会在没有警告的情况下更改)

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

if (!response.isSuccessful()) {
只有在响应不成功时才添加项,而不是在响应成功时才添加项


除此之外,根据代码的其余部分,您可能需要使用适配器上的
notify…
方法之一通知回收视图有关新项目。

由于某些原因,您在动物类中包含了
图像视图,因此请将其删除:

public class Animal {

private String status;
private String message;



public String getStatus() {
    return status;
}

public String getMessage() {
    return message;
}
 }
while
循环的

 //names must be of type string

while (names.size() < 50) names.add(response.body().getMessage());
也不确定为什么要使用while循环,可能要尝试填充列表:

public class Animal {

private String status;
private String message;



public String getStatus() {
    return status;
}

public String getMessage() {
    return message;
}
 }
这样做:

 @Override
public void onResponse(Call<Animal> call, Response<Animal> response) {

if(response.isSuccessful()){
for(int i=0 ; i<50 ; i++){
//names has to be of type String
names.add(response.body().getMessage())
}
RecyclerView recyclerView = rootView.findViewById(R.id.recycler_view);
RecyclerViewAdapter rAdapter = new RecyclerViewAdapter(names, this);
recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
recyclerView.setAdapter(rAdapter);
}
@覆盖
公共void onResponse(调用、响应){
if(response.issusccessful()){

对于(int i=0;i)我有一些代码,你是如何将适配器连接到回收服务的,我已经按照你的要求在JSON调用下完成了。哦,我的上帝,我认为那是一个假的API URL,这是我见过的最好的API添加了你的JSON数据。JSON数据看起来像这样(根据API站点):{“消息”:“,“状态”:“成功”}哇,谢谢你,真不敢相信我没有注意到。我修复了条件,但现在我通过添加标记发现代码执行得还不够。它只能调用Call=jsonAnimalApi.getAnimals().Hmmmm…就像“Here”不打印?代码在我看来是正确的…你能看到类似的日志语句打印在它之前吗?没错。我把“这里”在上面的几个位置,它会打印出来,但在声明之后它不会。而且它没有崩溃或其他什么吗?logcat中没有任何异常?它会在暂停和崩溃几分钟后抛出OutOfMemory异常,但没有其他异常。不过,我希望它将图片放入回收器视图,我仍然可以这样做吗?
imageView
不是您从JSON添加的数据,我在上面为您所做的帮助您将URL作为字符串传递到适配器,然后在适配器中使用字符串在作为recyclerview项一部分的
imageview
中显示图像。JSON中的URL是您希望在Adpeter中显示图像的URL。
 //names must be of type string

while (names.size() < 50) names.add(response.body().getMessage());
private ArrayList<String> mAnimalNames;

//constructor
public RecyclerViewAdapter(ArrayList<String> mAnimalNames,.......... 
 @Override
public void onResponse(Call<Animal> call, Response<Animal> response) {

if(response.isSuccessful()){
for(int i=0 ; i<50 ; i++){
//names has to be of type String
names.add(response.body().getMessage())
}
RecyclerView recyclerView = rootView.findViewById(R.id.recycler_view);
RecyclerViewAdapter rAdapter = new RecyclerViewAdapter(names, this);
recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
recyclerView.setAdapter(rAdapter);
}