Пытаюсь получить список служб по относительному URL, т.е. используя аннотацию @Path из веб-службы, которую я создал в Python-flask.Я использую Retrofit2 и Android Studio для достижения этой цели.
Я попытался получить все службы, и он работает отлично.Но когда я пытаюсь получить по относительной, то есть с помощью аннотации @Path, я получаю исключение;java.lang.NullPointerException: попытка вызвать метод интерфейса int java.util.List.size () для нулевой ссылки на объект
Это класс адаптера:
private Context mCtx;
private List<Service> serviceList;
public ServicesAdapter(Context mCtx, List<Service> serviceList) {
this.mCtx = mCtx;
this.serviceList = serviceList;
}
@NonNull
@Override
public ServicesViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(mCtx).inflate(R.layout.recyclerview_services, parent, false);
return new ServicesViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull ServicesViewHolder holder, int position) {
Service service = serviceList.get(position);
holder.tvRPortfolio.setText(service.getPortfolio());
holder.tvROccupation.setText(service.getOccupation());
holder.tvRBusinessName.setText(service.getBusiness_name());
holder.tvRDescription.setText(service.getDescription());
holder.tvRLocation.setText(service.getLocation());
holder.tvRWorking_hours.setText(service.getWorking_hours());
holder.tvRPhone.setText(service.getPhone());
holder.tvRCost.setText(service.getCost());
}
@Override
public int getItemCount() {
return serviceList.size();
}
class ServicesViewHolder extends RecyclerView.ViewHolder{
TextView tvRBusinessName, tvRDescription, tvRPortfolio, tvROccupation, tvRLocation, tvRWorking_hours, tvRPhone, tvRCost;
public ServicesViewHolder(@NonNull View itemView) {
super(itemView);
tvRPortfolio = itemView.findViewById(R.id.tvRPortfolio);
tvROccupation = itemView.findViewById(R.id.tvROccupation);
tvRBusinessName = itemView.findViewById(R.id.tvRBusinessName);
tvRDescription = itemView.findViewById(R.id.tvRDescription);
tvRLocation = itemView.findViewById(R.id.tvRLocation);
tvRWorking_hours = itemView.findViewById(R.id.tvRWorking_hours);
tvRPhone = itemView.findViewById(R.id.tvRPhone);
tvRCost = itemView.findViewById(R.id.tvRCost);
}
}
}
Это класс ViewServiceFragment:
Button btnPay;
private RecyclerView recyclerView;
private ServicesAdapter adapter;
private List<Service> serviceList;
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable final Bundle savedInstanceState) {
View searchView = inflater.inflate(R.layout.fragment_view_services, container, false);
setHasOptionsMenu(true);
btnPay = searchView.findViewById(R.id.btnPay);
btnPay.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
startActivity(new Intent(getActivity(), Login.class));
}
});
return searchView;
}
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
recyclerView = view.findViewById(R.id.rvGetServices);
recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
ServiceInterface serviceInterface = ServiceGenerator.createService(ServiceInterface.class);
Call<ServiceResponse> call = serviceInterface.getServices("Music");
call.enqueue(new Callback<ServiceResponse>() {
@Override
public void onResponse(Call<ServiceResponse> call, Response<ServiceResponse> response) {
serviceList = new ArrayList<>();
serviceList = response.body().getServices();
adapter = new ServicesAdapter(getActivity(), serviceList);
recyclerView.setAdapter(adapter);
}
@Override
public void onFailure(Call<ServiceResponse> call, Throwable t) {
}
});
}
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
inflater.inflate(R.menu.option_menu, menu);
super.onCreateOptionsMenu(menu, inflater);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.add_service:
startActivity(new Intent(getActivity(), AddServiceFragment.class));
return true;
case R.id.view_services:
startActivity(new Intent(getActivity(), ViewServicesFragment.class));
return true;
case R.id.register:
startActivity(new Intent(getActivity(), Register.class));
return true;
default:
return super.onOptionsItemSelected(item);
}
}
}
Это интерфейс:
@GET("api/v1/add_services/{occupation}")
Call<ServiceResponse> getServices(@Path("occupation") String occupation);
}
НаконецЭто модели
private String message;
private List<Service> services;
private String status;
public ServiceResponse(String message, List<Service> services, String status) {
this.message = message;
this.services = services;
this.status = status;
}
public String getMessage() {
return message;
}
public List<Service> getServices() {
return services;
}
public String getStatus() {
return status;
}
}
Вторая модель:
private Integer service_id;
private String name;
private String business_name;
private String portfolio;
private String occupation;
private String description;
private String phone;
private String location;
private String working_hours;
private String cost;
public Service(String name, String business_name, String portfolio, String occupation, String description, String phone, String location, String working_hours, String cost) {
this.name = name;
this.business_name = business_name;
this.portfolio = portfolio;
this.occupation = occupation;
this.description = description;
this.phone = phone;
this.location = location;
this.working_hours = working_hours;
this.cost = cost;
}
public Integer getService_id() {
return service_id;
}
public String getPortfolio() {
return portfolio;
}
public String getOccupation() {
return occupation;
}
public String getPhone() {
return phone;
}
public String getLocation() {
return location;
}
public String getWorking_hours() {
return working_hours;
}
public String getCost() {
return cost;
}
public String getName() {
return name;
}
public String getBusiness_name() {
return business_name;
}
public String getDescription() {
return description;
}
}