【问题标题】:Android: Fetch Different Object List Data Using RetrofitAndroid:使用 Retrofit 获取不同的对象列表数据
【发布时间】:2020-07-17 12:33:00
【问题描述】:

我正在尝试使用 Retrofit 获取不同类型的列表数据。 我已经制作了一个列表并在上面放了数据。

谁能建议我如何获取不同类型的模型数据?我有当我尝试将对象列表放入自定义模型列表时出现此错误:

java.lang.ClassCastException: com.google.gson.internal.LinkedTreeMap cannot be cast to .....

模型类

public class WorkType {

    @SerializedName("type")
    @Expose
    private String type;
    @SerializedName("worklist")
    @Expose
    private List<Object> worklist = null;

    /**
     * No args constructor for use in serialization
     * 
     */
    public WorkType() {
    }

    /**
     * 
     * @param worklist
     * @param type
     */
    public WorkType(String type, List<Object> worklist) {
        super();
        this.type = type;
        this.worklist = worklist;
    }

    public String getType() {
        return type;
    }

    public void setType(String type) {
        this.type = type;
    }

    public List<Object> getWorkList() {
        return worklist;
    }

    public void setWorkList(List<Object> worklist) {
        this.worklist = worklist;
    }

}

改造界面

@FormUrlEncoded
@POST("worklist")
Call<ArrayList<WorkType>> worklist(
    @Field("teamid") String teamID
);

我发出 API 请求的片段

public class WorkTypeListFragment extends Fragment {
    private FragmentWorkTypeListBinding binding;
    private LoadingDialog loadingDialog;
    private Context context;
    public WorkTypeListFragment() {
        // Required empty public constructor
    }

    @Override
    public void onAttach(@NonNull Context context) {
        super.onAttach(context);
        this.context = context;
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment

        binding = DataBindingUtil.inflate(inflater,R.layout.fragment_work_type_list,container,false);

        init();

        String teamID = getActivity().getIntent().getStringExtra("teamid");
        fetchClientDetails("team1");

        return binding.getRoot();
    }

    private void init() {
        loadingDialog = new LoadingDialog(getActivity());
    }

    private void fetchClientDetails(String teamID){
        loadingDialog.startLoadingDialog(); // Added Loading Screen


        Call<ArrayList<WorkType>> call = RetrofitClient
                .getInstance()
                .getRetrofitApi()
                .worklist(teamID);

        call.enqueue(new Callback<ArrayList<WorkType>>() {
            @Override
            public void onResponse(Call<ArrayList<WorkType>> call, Response<ArrayList<WorkType>> response) {
                try{
                    if(response.code() == 200){

                        ArrayList<WorkType> workTypeArrayList = response.body();
                        //Log.d("TAG", "onResponse: "+workTypeArrayList.get(1).getWorkList().get(0).getClientname());

                        assert workTypeArrayList != null;
                        bindDataToView(workTypeArrayList);

                    } else {
                        Toast.makeText(getContext(), "Response Code is no 200", Toast.LENGTH_SHORT).show();
                        loadingDialog.dismissDialog();
                    }

                }catch(Exception e){
                    e.printStackTrace();
                }
            }

            @Override
            public void onFailure(Call<ArrayList<WorkType>> call, Throwable t) {
                Toast.makeText(getContext(), "Something Went wrong! Please try again later!", Toast.LENGTH_SHORT).show();
                loadingDialog.dismissDialog();
            }

        });

    }

    private void bindDataToView(ArrayList<WorkType> workTypeArrayList) {

        WorkTypesAdapter adapter = new WorkTypesAdapter(context,workTypeArrayList);
        binding.workTypeRv.setLayoutManager(new LinearLayoutManager(context));
        binding.workTypeRv.setAdapter(adapter);
    }
}

RecyclearView 适配器类

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

    private Context mCtx;
    private List<WorkType> workTypeList;
    private final static int survey = 1;
    private final static int service = 2;
    private final static int maintain = 3;

    public WorkTypesAdapter(Context mCtx, List<WorkType> modelServiceList) {
        this.mCtx = mCtx;
        this.workTypeList = modelServiceList;
    }

    @NonNull
    @Override
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        LayoutInflater inflater = LayoutInflater.from(mCtx);
        View view = inflater.inflate(R.layout.layout_worktype, null);
        return new ViewHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull ViewHolder holder, int position) {

        WorkType currentWorkType  = workTypeList.get(position);
        String modelClass = currentWorkType.getType();
        List<Object> objectList = currentWorkType.getWorkList();

        switch (modelClass){
            /*case "survey":
                List<SurveyWorkList> surveyWorkLists = new ArrayList<>();
                for (Object object : objectList) {
                    surveyWorkLists.add((SurveyWorkList) object);

                    holder.workType.setText(currentWorkType.getType());
                    holder.workTypeCount.setText(surveyWorkLists.size());

                }

                break;*/
            case "service":
                List<ServiceWorkList> serviceWorkLists = new ArrayList<>();
                for (Object object : objectList) {
                    serviceWorkLists.add((ServiceWorkList) object);
                }

                /*holder.workType.setText(currentWorkType.getType());
                holder.workTypeCount.setText(serviceWorkLists.size());*/
                break;
            /*case "maintain":
                List<MaintainWorkList> maintainWorkLists = new ArrayList<>();
                for (Object object : objectList) {
                    maintainWorkLists.add((MaintainWorkList) object);
                }

                holder.workType.setText(currentWorkType.getType());
                holder.workTypeCount.setText(maintainWorkLists.size());
                break;*/

            default:
                //Do nothing

        }

        /*holder.workType.setText(modelService.getType());
        holder.workTypeCount.setText(workTypeList.size());*/
    }

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

    public class ViewHolder extends RecyclerView.ViewHolder{

        TextView workType, workTypeCount;

        public ViewHolder(@NonNull View itemView) {
            super(itemView);

            workType = itemView.findViewById(R.id.work_type_tv);
            workTypeCount = itemView.findViewById(R.id.work_type_count_tv);
        }
    }
}

API 响应

[
    {
        "type": "survey",
        "worklist": []
    },
    {
        "type": "service",
        "worklist": [
            {
                "serviceid": "HS2020031613054318",
                "clientid": "R2020031612594874",
                "clientname": "********",
                "companyname": "",
                "membership": "",
                "phone": [
                    "*********"
                ],
                "**************",
                "account": 2,
                "slot": "morning",
                "orderstatus": "Completed",
                "orderstatuscode": "8",
                "remarks": ""
            }
        ]
    },
    {
        "type": "maintain",
        "worklist": []
    }
]

测量和维护会有不同的参数。

【问题讨论】:

    标签: android json retrofit


    【解决方案1】:

    我找到了答案。 首先,你必须创建一个模型类:

    @SerializedName("contents")
    @Expose
    private JsonElement contents = null;
    

    在我的 API 中,我得到了一个元素类型。所以你知道你必须以哪种类型解析数据。假设您有三种类型。所以我们将创建一个 Type 对象:

    switch(type)
        case 1:
            Type type = new TypeToken<ArrayList<Banner>>() {
                    }.getType();
                   
            ArrayList<Banner> bannerList = new Gson().fromJson(baseModel.getContents(), type);
    

    【讨论】:

      猜你喜欢
      • 2016-08-05
      • 2016-02-22
      • 1970-01-01
      • 2020-09-29
      • 1970-01-01
      • 1970-01-01
      • 2018-02-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多