RecyclerView 未填充 Json 数据 (Android)(改造 2)

RecyclerView not populating with Json data (Android) (Retrofit 2)

我在使用 Retrofit 使用 JSON 数据填充 RecyclerView 时遇到问题。每当我 运行 我的代码时,我的应用程序就会崩溃,而且我并不真正理解堆栈跟踪。我也要去 post 下面那个

堆栈跟踪

E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example.fetchproject, PID: 12680
    android.content.res.Resources$NotFoundException: String resource ID #0x2f3
        at android.content.res.Resources.getText(Resources.java:444)
        at android.widget.TextView.setText(TextView.java:6412)
        at com.example.fetchproject.HiringAdapter.onBindViewHolder(HiringAdapter.java:31)
        at com.example.fetchproject.HiringAdapter.onBindViewHolder(HiringAdapter.java:13)
        at androidx.recyclerview.widget.RecyclerView$Adapter.onBindViewHolder(RecyclerView.java:7065)
        at androidx.recyclerview.widget.RecyclerView$Adapter.bindViewHolder(RecyclerView.java:7107)
        at androidx.recyclerview.widget.RecyclerView$Recycler.tryBindViewHolderByDeadline(RecyclerView.java:6012)
        at androidx.recyclerview.widget.RecyclerView$Recycler.tryGetViewHolderForPositionByDeadline(RecyclerView.java:6279)
        at androidx.recyclerview.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:6118)
        at androidx.recyclerview.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:6114)
        at androidx.recyclerview.widget.LinearLayoutManager$LayoutState.next(LinearLayoutManager.java:2303)
        at androidx.recyclerview.widget.LinearLayoutManager.layoutChunk(LinearLayoutManager.java:1627)
        at androidx.recyclerview.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1587)
        at androidx.recyclerview.widget.LinearLayoutManager.onLayoutChildren(LinearLayoutManager.java:665)
        at androidx.recyclerview.widget.RecyclerView.dispatchLayoutStep2(RecyclerView.java:4134)
        at androidx.recyclerview.widget.RecyclerView.dispatchLayout(RecyclerView.java:3851)
        at androidx.recyclerview.widget.RecyclerView.onLayout(RecyclerView.java:4404)
        at android.view.View.layout(View.java:22844)
        at android.view.ViewGroup.layout(ViewGroup.java:6389)
        at androidx.constraintlayout.widget.ConstraintLayout.onLayout(ConstraintLayout.java:1855)
        at android.view.View.layout(View.java:22844)
        at android.view.ViewGroup.layout(ViewGroup.java:6389)
        at android.widget.FrameLayout.layoutChildren(FrameLayout.java:332)
        at android.widget.FrameLayout.onLayout(FrameLayout.java:270)
        at android.view.View.layout(View.java:22844)
        at android.view.ViewGroup.layout(ViewGroup.java:6389)
        at androidx.appcompat.widget.ActionBarOverlayLayout.onLayout(ActionBarOverlayLayout.java:536)
        at android.view.View.layout(View.java:22844)
        at android.view.ViewGroup.layout(ViewGroup.java:6389)
        at android.widget.FrameLayout.layoutChildren(FrameLayout.java:332)
        at android.widget.FrameLayout.onLayout(FrameLayout.java:270)
        at android.view.View.layout(View.java:22844)
        at android.view.ViewGroup.layout(ViewGroup.java:6389)
        at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1829)
        at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1673)
        at android.widget.LinearLayout.onLayout(LinearLayout.java:1582)
        at android.view.View.layout(View.java:22844)
        at android.view.ViewGroup.layout(ViewGroup.java:6389)
        at android.widget.FrameLayout.layoutChildren(FrameLayout.java:332)
        at android.widget.FrameLayout.onLayout(FrameLayout.java:270)
        at com.android.internal.policy.DecorView.onLayout(DecorView.java:784)
        at android.view.View.layout(View.java:22844)
        at android.view.ViewGroup.layout(ViewGroup.java:6389)
        at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:3470)
        at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2938)
        at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1952)
        at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:8171)
        at android.view.Choreographer$CallbackRecord.run(Choreographer.java:972)
        at android.view.Choreographer.doCallbacks(Choreographer.java:796)
        at android.view.Choreographer.doFrame(Choreographer.java:731)
        at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:957)
        at android.os.Handler.handleCallback(Handler.java:938)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:223)
E/AndroidRuntime:     at android.app.ActivityThread.main(ActivityThread.java:7656)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947)
W/System: A resource failed to call close. 

MainActivity.java

import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

import android.os.Bundle;
import android.util.Log;
import android.widget.TextView;
import android.widget.Toast;

import java.util.ArrayList;
import java.util.List;

import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
import retrofit2.Retrofit;

public class MainActivity extends AppCompatActivity {

    RecyclerView recyclerView;
    TextView textView;
    LinearLayoutManager layoutManager;
    HiringAdapter adapter;
    List<Hiring> hiringList = new ArrayList<>();

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

        recyclerView = findViewById(R.id.recyclerView);
        textView = findViewById(R.id.titleName);
        layoutManager = new LinearLayoutManager(this);
        recyclerView.setLayoutManager(layoutManager);
        adapter = new HiringAdapter(hiringList);
        recyclerView.setAdapter(adapter);

        fetchHiring();
    }

    private void fetchHiring() {
        RetrofitClient.getRetrofitClient().getHiring().enqueue(new Callback<List<Hiring>>() {
            @Override
            public void onResponse(Call<List<Hiring>> call, Response<List<Hiring>> response) {
                if(response.isSuccessful() && response.body() != null) {
                    hiringList.addAll(response.body());
                    adapter.notifyDataSetChanged();
                    return;
                }
            }

            @Override
            public void onFailure(Call<List<Hiring>> call, Throwable t) {
                Toast.makeText(MainActivity.this, "Error: " + t.getMessage(), Toast.LENGTH_SHORT).show();

            }
        });
    }
}

Hiring.java

package com.example.fetchproject;

public class Hiring
{
    private int id;
    private int listId;
    private String name;

    public Hiring(int id, int listId, String name)
    {
        this.id = id;
        this.listId = listId;
        this.name = name;
    }


    public int getId() {
        return id;
    }

    public int getListId() {
        return listId;
    }

    public String getName() {
        return name;
    }
}

RetrofitClient.java

import retrofit2.Retrofit;
import retrofit2.converter.gson.GsonConverterFactory;

public class RetrofitClient
{
    private static final String BASE_URL = "leaving this empty while posting for help";
    private static Retrofit retrofit = null;

    public static HiringAPI getRetrofitClient() {
        if(retrofit == null) {
            retrofit = new Retrofit.Builder()
                    .baseUrl(BASE_URL)
                    .addConverterFactory(GsonConverterFactory.create())
                    .build();
        }
        return retrofit.create(HiringAPI.class);
    }
}

HiringAdapter.java

import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;

import java.util.List;

public class HiringAdapter extends RecyclerView.Adapter<HiringAdapter.ViewHolder> {

    private List<Hiring> hiringList;

    public HiringAdapter(List<Hiring> hiringList) {
        this.hiringList = hiringList;
    }

    @NonNull
    @Override
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.hiring_item, parent, false);
        return new ViewHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
        holder.tvId.setText(hiringList.get(position).getId());
        holder.tvListId.setText(hiringList.get(position).getListId());
        holder.tvName.setText(hiringList.get(position).getName());
    }

    @Override
    public int getItemCount() {
        return hiringList.size();
    }

    public class ViewHolder extends RecyclerView.ViewHolder
    {
        TextView tvId;
        TextView tvListId;
        TextView tvName;
        public ViewHolder(@NonNull View itemView) {
            super(itemView);

            tvId = itemView.findViewById(R.id.id);
            tvListId = itemView.findViewById(R.id.listId);
            tvName = itemView.findViewById(R.id.name);

        }
    }
}

HiringAPI.java(接口)

import retrofit2.Call;
import retrofit2.http.GET;
import java.util.List;

public interface HiringAPI {
    @GET("leaving this empty while posting for help")
    Call<List<Hiring>> getHiring();
}

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <TextView
        android:id="@+id/titleName"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="16dp"
        android:layout_marginBottom="25dp"
        android:text="@string/karan_s_fetch_project"
        app:layout_constraintBottom_toTopOf="@+id/recyclerView"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintVertical_bias="0.022" />

    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/recyclerView"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:layout_marginBottom="7dp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/titleName" />

</androidx.constraintlayout.widget.ConstraintLayout>

hiring_item.xml

<?xml version="1.0" encoding="utf-8"?>
<com.google.android.material.card.MaterialCardView xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_margin="8dp"
    app:cardCornerRadius="5dp"
    app:cardElevation="3dp">

    <androidx.constraintlayout.widget.ConstraintLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:padding="5dp"
        >


        <TextView
            android:id="@+id/id"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@string/id"
            android:textColor="@color/black"
            android:textSize="18sp"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent" />

        <TextView
            android:id="@+id/listId"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@string/listid"
            android:textSize="18sp"
            tools:layout_editor_absoluteX="0dp"
            tools:layout_editor_absoluteY="19dp"
            android:textColor="@color/black"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toBottomOf="@id/id"/>

        <TextView
            android:id="@+id/name"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@string/name"
            android:textSize="18sp"
            tools:layout_editor_absoluteX="0dp"
            tools:layout_editor_absoluteY="38dp"
            android:textColor="@color/black"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toBottomOf="@id/listId"
            />

    </androidx.constraintlayout.widget.ConstraintLayout>

</com.google.android.material.card.MaterialCardView>

JSON 文件

[
{"id": 755, "listId": 2, "name": ""},
{"id": 203, "listId": 2, "name": ""},
{"id": 684, "listId": 1, "name": "Item 684"},
{"id": 276, "listId": 1, "name": "Item 276"},
{"id": 736, "listId": 3, "name": null},
{"id": 926, "listId": 4, "name": null},
{"id": 808, "listId": 4, "name": "Item 808"},
{"id": 599, "listId": 1, "name": null},
{"id": 424, "listId": 2, "name": null},
{"id": 444, "listId": 1, "name": ""},
{"id": 809, "listId": 3, "name": null},
{"id": 293, "listId": 2, "name": null},
{"id": 510, "listId": 2, "name": null},
{"id": 680, "listId": 3, "name": "Item 680"},
{"id": 231, "listId": 2, "name": null},
{"id": 534, "listId": 4, "name": "Item 534"},
{"id": 294, "listId": 4, "name": ""},
{"id": 439, "listId": 1, "name": null},
{"id": 156, "listId": 2, "name": null},
{"id": 906, "listId": 2, "name": "Item 906"},
{"id": 49, "listId": 2, "name": null},
{"id": 48, "listId": 2, "name": null},
{"id": 735, "listId": 1, "name": "Item 735"},
{"id": 52, "listId": 2, "name": ""},
{"id": 681, "listId": 4, "name": "Item 681"},
{"id": 137, "listId": 3, "name": "Item 137"},
{"id": 989, "listId": 1, "name": null},
{"id": 94, "listId": 1, "name": ""},
{"id": 177, "listId": 1, "name": null},
{"id": 263, "listId": 1, "name": ""},
{"id": 196, "listId": 1, "name": "Item 196"},
{"id": 669, "listId": 2, "name": "Item 669"},
{"id": 710, "listId": 3, "name": "Item 710"},
{"id": 145, "listId": 1, "name": null},
{"id": 92, "listId": 4, "name": null},
{"id": 68, "listId": 3, "name": "Item 68"},
{"id": 364, "listId": 2, "name": "Item 364"},
{"id": 174, "listId": 2, "name": null},
{"id": 406, "listId": 3, "name": "Item 406"},
{"id": 394, "listId": 2, "name": "Item 394"},
{"id": 624, "listId": 1, "name": ""},
{"id": 969, "listId": 4, "name": "Item 969"},
{"id": 947, "listId": 2, "name": ""},
{"id": 743, "listId": 1, "name": null},
{"id": 419, "listId": 1, "name": ""},
{"id": 834, "listId": 4, "name": null},
{"id": 91, "listId": 3, "name": ""},
{"id": 163, "listId": 2, "name": ""},
{"id": 471, "listId": 3, "name": "Item 471"},
{"id": 442, "listId": 1, "name": ""},
{"id": 205, "listId": 4, "name": null},
]

图像中的此处表示在 textView 中找不到字符串。检查您的适配器正在获取的数据。

问题是我试图设置文本整数,而不是 String.valueOf