Android Retrofit RecyclerView error: incompatible types: <anonymous Callback<ServiceResponse>> cannot be converted to Callback<Service>

Android Retrofit RecyclerView error: incompatible types: <anonymous Callback<ServiceResponse>> cannot be converted to Callback<Service>

我正在尝试从我朋友创建的 API 制作 RecyclerView。

但是突然遇到这个问题,帮我解决一下:'(

我不知道这是什么意思,因为这是我第一次使用 RecyclerView 数据改造。非常感谢您的帮助。

/home/ardityoc/AndroidStudioProjects/HomeCare/app/src/main/java/com/humic/android/homecare/ui/user/home/HomeFragment.java:83: error: incompatible types: <anonymous Callback<ServiceResponse>> cannot be converted to Callback<Service>
    ServiceApiService.getAllServicesUserRequest("Bearer " + loadToken()).enqueue(new Callback<ServiceResponse>() {
                                                                                 ^

这是我的HomeFragment.java

package com.humic.android.homecare.ui.user.home;

import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import android.widget.Toast;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.widget.Toolbar;
import androidx.fragment.app.Fragment;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

import com.google.android.material.appbar.CollapsingToolbarLayout;
import com.humic.android.homecare.R;
import com.humic.android.homecare.activity.user.MainActivity;
import com.humic.android.homecare.adapter.RecyclerViewServiceAdapter;
import com.humic.android.homecare.model.Service;
import com.humic.android.homecare.rest.ApiClient;
import com.humic.android.homecare.rest.ApiInterface;
import com.humic.android.homecare.rest.service.ServiceResponse;

import org.json.JSONException;
import org.json.JSONObject;

import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

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

import static android.content.Context.MODE_PRIVATE;
import static com.humic.android.homecare.activity.LoginActivity.userToken;
import static com.humic.android.homecare.activity.user.CurrentUserActivity.userName;
import static com.humic.android.homecare.utils.SharedPreference.SHARED_PREFS_TOKEN;
import static com.humic.android.homecare.utils.SharedPreference.SHARED_PREFS_USER;

public class HomeFragment extends Fragment {

    String nameCache, tokenCache;
    TextView UserName;

    RecyclerView ServiceRecyclerView;
    RecyclerViewServiceAdapter ServiceAdapter;

    List<Service> ServiceList;

    Context ServiceContext;
    ApiInterface ServiceApiService;

    public View onCreateView(@NonNull LayoutInflater inflater,
                             ViewGroup container, Bundle savedInstanceState) {
        View root = inflater.inflate(R.layout.fragment_home, container, false);

        ServiceContext = getContext();
        ServiceApiService = ApiClient.getAPIService();

        initComponents(root);

        return root;
    }

    @Override
    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);

        ServiceRecyclerView = (RecyclerView) getView().findViewById(R.id.list_home_service);
        ServiceAdapter = new RecyclerViewServiceAdapter(getActivity(),ServiceList);
        ServiceRecyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
    }

    private void requestServices() {
        ServiceApiService.getAllServicesUserRequest("Bearer " + loadToken()).enqueue(new Callback<ServiceResponse>() {
            @Override
            public void onResponse(Call<ServiceResponse> call, Response<ServiceResponse> response) {
                if (response.isSuccessful()){
                    Log.i("debug", "onResponse: Berhasil");
                    try {
                        ServiceResponse jsonResponse = response.body();
                        JSONObject jsonRESULTS = new JSONObject(jsonResponse.toString());
                        if (jsonRESULTS.getJSONObject("meta").getString("status").equals("success")){
//                            ServiceList = new ArrayList<>(jsonResponse.getServiceResponse());

                            ServiceList = jsonResponse.getServiceResponse();

                            ServiceRecyclerView.setAdapter(ServiceAdapter);
                        } else {
                            String error_message = jsonRESULTS.getString("error_msg");
                            Toast.makeText(ServiceContext, error_message, Toast.LENGTH_SHORT).show();
                        }
                    } catch (JSONException | IOException e) { //Error di sini
                        e.printStackTrace();
                    }
                } else {
                    Log.i("debug", "onResponse: Tidak Berhasil");
                }
            }

            @Override
            public void onFailure(Call<ServiceResponse> call, Throwable t) {
                Log.e("debug", "onFailure: ERROR > " + t.getMessage());
                Toast.makeText(ServiceContext, "Koneksi Internet Bermasalah", Toast.LENGTH_SHORT).show();
            }
        });
    }

    private void initComponents(View root){
        getViewId(root);

        UserName.setText(loadCurrentUserName());

        Toolbar toolbar = (Toolbar) getActivity().findViewById(R.id.toolbar);
        CollapsingToolbarLayout toolBarLayout = (CollapsingToolbarLayout) getActivity().findViewById(R.id.toolbar_layout);
    }

    private void getViewId(View root){
        UserName = root.findViewById(R.id.user_name);
    }

    private String loadToken(){
        final SharedPreferences sharedPreferences = getActivity().getSharedPreferences(SHARED_PREFS_TOKEN, MODE_PRIVATE);

        tokenCache = sharedPreferences.getString(userToken, "");
        return tokenCache;
    }

    private String loadCurrentUserName(){
        final SharedPreferences sharedPreferences = getActivity().getSharedPreferences(SHARED_PREFS_USER, MODE_PRIVATE);

        nameCache = sharedPreferences.getString(userName, "");
        return nameCache;
    }

}
                                                                                     ^

这是我朋友的JSON回复

{
    "meta": {
        "code": 200,
        "status": "success",
        "message": "successfully load data"
    },
    "data": [
        {
            "id": 1,
            "name": "Pemasangan infus",
            "information": "pemasangan kateter untuk kegiatan medis",
            "image": "https://via.placeholder.com/300",
            "price": 120000,
            "created_at": "2021-07-29T01:35:43.000000Z",
            "updated_at": "2021-07-29T01:35:43.000000Z"
        },
        {
            "id": 2,
            "name": "Pemasangan infus",
            "information": "pemasangan infus untuk kegiatan medis",
            "image": "https://via.placeholder.com/300",
            "price": 80000,
            "created_at": "2021-07-29T01:35:43.000000Z",
            "updated_at": "2021-07-29T01:35:43.000000Z"
        },
        {
            "id": 3,
            "name": "Perawatan luka jahitan",
            "information": "perawatan luka pasca operasi, umumnya luka jahitan",
            "image": "https://via.placeholder.com/300",
            "price": 70000,
            "created_at": "2021-07-29T01:35:43.000000Z",
            "updated_at": "2021-07-29T01:35:43.000000Z"
        },
        {
            "id": 4,
            "name": "suntik vaksin titan",
            "information": "melakukan suntik untuk mendapatkan kekuatan titan, kekuatan titan yang dihasilkan bersifat acak.",
            "image": "http://149.28.136.231/storage/services/Titan_injection_(Anime).webp",
            "price": 120000,
            "created_at": "2021-07-29T04:11:43.000000Z",
            "updated_at": "2021-07-29T10:17:05.000000Z"
        }
    ]
}

这是我的Service.java

package com.humic.android.homecare.model;

import com.google.gson.annotations.Expose;
import com.google.gson.annotations.SerializedName;

public class Service {

    @SerializedName("id")
    @Expose
    private int id;
    @SerializedName("name")
    @Expose
    private String name;
    @SerializedName("information")
    @Expose
    private String information ;
    @SerializedName("image")
    @Expose
    private String image ;
    @SerializedName("price")
    @Expose
    private int price ;

    public Service() {}

    public Service(int Id, String Name, String Information, String Image, int Price) {
        this.id = Id;
        this.name = Name;
        this.information = Information;
        this.image = Image;
        this.price = Price;
    }

    public int getId() {
        return id;
    }

    public String getName() {
        return name;
    }

    public String getInformation() {
        return information;
    }

    public String getImage() {
        return image;
    }

    public int getPrice() {
        return price;
    }

    public void setId(int Id) {
        this.id = Id;
    }

    public void setName(String Name) {
        this.name = Name;
    }

    public void setInformation(String Information) {
        this.information = Information;
    }

    public void setImage(String Image) {
        this.image = Image;
    }

    public void setPrice(int Price) {
        this.price = Price;
    }

}

这是我的ServiceResponse.java

package com.humic.android.homecare.rest.service;

import com.google.gson.annotations.SerializedName;
import com.humic.android.homecare.model.Service;

import java.util.ArrayList;

public class ServiceResponse {

    @SerializedName("data")
    ArrayList<Service> ServiceResponse;

    public ArrayList<Service> getServiceResponse() {
        return ServiceResponse;
    }

    public void setServiceResponse(ArrayList<Service> ServiceResponse) {
        this.ServiceResponse = ServiceResponse;
    }
}

这是我的RecyclerViewServiceAdapter.java

package com.humic.android.homecare.adapter;

import android.content.Context;
import android.content.Intent;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;

import androidx.cardview.widget.CardView;
import androidx.recyclerview.widget.RecyclerView;

import com.humic.android.homecare.R;
import com.humic.android.homecare.activity.user.ServiceActivity;
import com.humic.android.homecare.model.Service;

import org.jetbrains.annotations.NotNull;

import java.util.List;

public class RecyclerViewServiceAdapter extends RecyclerView.Adapter<RecyclerViewServiceAdapter.ServiceViewHolder> {

    private Context serviceContext ;
    private List<Service> serviceData ;


    public RecyclerViewServiceAdapter(Context serviceContext, List<Service> serviceData) {
        this.serviceContext = serviceContext;
        this.serviceData = serviceData;

    }

    @NotNull
    @Override
    public ServiceViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

        View view ;
        LayoutInflater mInflater = LayoutInflater.from(serviceContext);
        view = mInflater.inflate(R.layout.item_home_service,parent,false);
        return new ServiceViewHolder(view);

    }

    @Override
    public void onBindViewHolder(ServiceViewHolder holder, final int position) {

        holder.serviceName.setText(serviceData.get(position).getName());
//        holder.serviceThumbnail.setImageResource(serviceData.get(position).getImage());
        holder.serviceCardView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                Intent intent = new Intent(serviceContext, ServiceActivity.class);

                intent.putExtra("name",serviceData.get(position).getName());
                intent.putExtra("information",serviceData.get(position).getInformation());
                intent.putExtra("price",serviceData.get(position).getPrice());
//                intent.putExtra("image",serviceData.get(position).getImage());

                serviceContext.startActivity(intent);

            }

        });

    }

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

    public static class ServiceViewHolder extends RecyclerView.ViewHolder {

        TextView serviceName;
//        ImageView serviceImage;
        CardView serviceCardView ;

        public ServiceViewHolder(View itemView) {
            super(itemView);

            serviceName = (TextView) itemView.findViewById(R.id.list_home_service_title) ;
//            serviceImage = (ImageView) itemView.findViewById(R.id.list_home_service_thumbnail);
            serviceCardView = (CardView) itemView.findViewById(R.id.list_home_service_cardview);

        }

    }

}

这是我的ApiInterface.java

package com.humic.android.homecare.rest;

import com.humic.android.homecare.model.Service;

import okhttp3.ResponseBody;
import retrofit2.Call;
import retrofit2.http.Field;
import retrofit2.http.FormUrlEncoded;
import retrofit2.http.GET;
import retrofit2.http.Header;
import retrofit2.http.POST;
import retrofit2.http.Path;
import retrofit2.http.Query;

public interface ApiInterface {
// Services
    @GET("services")
    Call<Service> getAllServicesUserRequest(@Header("Authorization") String token);
}

getAllServicesUserRequest 的签名不正确。根据提供的 json,它应该接收 ServiceResponse,当您将您也在此处定义的您期望 ServiceResponse 的呼叫入队时也是如此。因此,将 getAllServicesUserRequest 的签名更新为 Call<ServiceResponse> 应该可以解决您的问题:

@GET("services")
Call<ServiceResponse> getAllServicesUserRequest(@Header("Authorization") String token);