Android: извлечение данных из другого списка объектов с помощью модернизации - PullRequest
1 голос
/ 05 апреля 2020

Я пытаюсь получить различные типы данных List с помощью 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

publi c Класс WorkTypesAdapter расширяет RecyclerView.Adapter {

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": []
}

]

Для опроса и ведения будет другой параметр.

...