hello iam trying to populate a recyclerview with data from API the data from a sub table inside the main table below is all code for more clarity.
API JSON. i am aware of the problem with expected begin_object but was begin_array and did it properly.
{
"Status": 200,
"Message": "OK",
"Data": {
"MainServices": [
{
"Id": 11,
"ServiceTypeId": 1,
"MainServiceNameAr": "تكييفات\r\n",
"MainServiceNameEn": "Air conditioning\r\n",
"SubServices": []
},
{
"Id": 12,
"ServiceTypeId": 1,
"MainServiceNameAr": "كهرباء\r\n",
"MainServiceNameEn": "Electricity\r\n",
"SubServices": []
},
{
"Id": 14,
"ServiceTypeId": 1,
"MainServiceNameAr": "سباكة",
"MainServiceNameEn": "Plumbing\r\n",
"SubServices": [
{
"Id": 24,
"MainServiceId": 14,
"SubServiceNameAr": "ادوات صحة\r\n",
"SubServiceNameEn": "Health Tools\r\n",
"ServicePriceLists": []
},
{
"Id": 25,
"MainServiceId": 14,
"SubServiceNameAr": "انسداد المياه\r\n",
"SubServiceNameEn": "Water blockage\r\n",
"ServicePriceLists": []
}
]
},
{
"Id": 15,
"ServiceTypeId": 1,
"MainServiceNameAr": "اجهزة منزلية\r\n",
"MainServiceNameEn": "Home appliances\r\n",
"SubServices": []
},
{
"Id": 16,
"ServiceTypeId": 2,
"MainServiceNameAr": "نظافة\r\n",
"MainServiceNameEn": "Cleaning\r\n",
"SubServices": []
}
]
}
}
Models. i separated the models as ResponseModel, DataModel (where DataModel includes the rest of the Lists and services) and MainServicesModel with ServicesTypeModel
public class MainServicesModel {
@SerializedName("Id")
public int Id;
@SerializedName("ServiceTypeId")
public int ServiceTypeId;
@SerializedName("MainServiceNameAr")
public String MainServiceNameAr;
@SerializedName("MainServiceNameEn")
public String MainServiceNameEn;
@SerializedName("SubServices")
public List<SubServicesModel> subServicesModel;
public int getId() {
return Id;
}
public void setId(int id) {
Id = id;
}
public int getServiceTypeId() {
return ServiceTypeId;
}
public void setServiceTypeId(int serviceTypeId) {
ServiceTypeId = serviceTypeId;
}
public String getMainServiceNameAr() {
return MainServiceNameAr;
}
public void setMainServiceNameAr(String mainServiceNameAr) {
MainServiceNameAr = mainServiceNameAr;
}
public String getMainServiceNameEn() {
return MainServiceNameEn;
}
public void setMainServiceNameEn(String mainServiceNameEn) {
MainServiceNameEn = mainServiceNameEn;
}
public List<SubServicesModel> getSubServicesModel() {
return subServicesModel;
}
public void setSubServicesModel(List<SubServicesModel> subServicesModel) {
this.subServicesModel = subServicesModel;
}
}
MainServiceAdapter
public class MainServiceAdapter extends RecyclerView.Adapter<MainServiceAdapter.MainServiceHolder> {
private List<MainServicesModel> mainServicesModelList;
private MainServiceListener listener;
public MainServiceAdapter(List<MainServicesModel> mainServicesModels , MainServiceListener listener) {
this.mainServicesModelList = mainServicesModels;
this.listener = listener;
}
@NonNull
@Override
public MainServiceAdapter.MainServiceHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View iteView = LayoutInflater.from(parent.getContext()).inflate(R.layout.main_service_item, parent, false);
return new MainServiceHolder(iteView);
}
@Override
public void onBindViewHolder(@NonNull MainServiceAdapter.MainServiceHolder holder, int position) {
holder.MainServiceTxt.setText(mainServicesModelList.get(position).getMainServiceNameAr());
}
@Override
public int getItemCount() {
// return null!=mainServicesModelList?mainServicesModelList.size():0;
return mainServicesModelList.size();
}
public long getItemId(int position) {
return position;
}
public void setMainServicesModelList(List<MainServicesModel> mainServicesModelList) {
this.mainServicesModelList = mainServicesModelList;
notifyDataSetChanged();
}
public class MainServiceHolder extends RecyclerView.ViewHolder {
TextView MainServiceTxt;
// ImageView
public MainServiceHolder(@NonNull View itemView) {
super(itemView);
MainServiceTxt = itemView.findViewById(R.id.MainServiceName);
itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
listener.onMainServiceSelected(mainServicesModelList.get(getAdapterPosition()));
}
});
}
}
public interface MainServiceListener {
void onMainServiceSelected(MainServicesModel mainServicesModel);
}
}
MainActivity
public class MainServicesAndSubServices extends AppCompatActivity implements MainServiceAdapter.MainServiceListener {
private final List<MainServicesModel> mainServicesModelArrayList = new ArrayList<>();
MainServiceAdapter serviceAdapter = new MainServiceAdapter(mainServicesModelArrayList, this);
MainServiceViewModel mainServiceViewModel;
RecyclerView MainServiceRV;
int ServiceTypeId ;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main_sub_services);
// Here i call the ServiceTypeId from MainServiceType
Intent intent = getIntent();
Bundle bd = intent.getExtras();
if (bd != null) {
ServiceTypeId = (int) bd.get("ServiceTypeId");
}
Toast.makeText(MainServicesAndSubServices.this, "" + ServiceTypeId,
Toast.LENGTH_SHORT).show();
// Here i call the ServiceTypeId from MainServiceType
try {
MainServiceRV = findViewById(R.id.RVMainServices);
mainServiceViewModel = ViewModelProviders.of(this).get(MainServiceViewModel.class);
mainServiceViewModel.getMainServicesByServiceTypeId(ServiceTypeId);
LinearLayoutManager layoutManager = new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false);
MainServiceRV.setLayoutManager(layoutManager);
MainServiceRV.setAdapter(serviceAdapter);
FillMainServicesList();
} catch (Exception e) {
e.printStackTrace();
}
}
private void FillMainServicesList() {
mainServiceViewModel.MainServiceMutableLiveData.observe(MainServicesAndSubServices.this, new Observer<ResponseModel>() {
@Override
public void onChanged(ResponseModel responseModel) {
serviceAdapter.setMainServicesModelList(responseModel.getData().getMainServicesModels());
serviceAdapter.notifyDataSetChanged();
Toast.makeText(MainServicesAndSubServices.this, "" + responseModel.getData().getMainServicesModels(), Toast.LENGTH_SHORT).show();
MainServiceRV.setAdapter(serviceAdapter);
}
});
}
@Override
public void onMainServiceSelected(MainServicesModel mainServicesModel) {
}
}
I created another service in the API to facilitate my coding
getMainServicesByServicesTypeId(ServiceTypeId)
any help would be appreciated thank you in advance if u need any more clarification please don't hesitate to ask
call it at the MainServiceclient
public Call<ResponseModel> GetMainServiceByServiceTypeId(int id) {
return serviceMainInterface.GetMainServiceByServiceTypeId(id);
}