Search code examples
androidspinnerandroid-spinnerretrofit2custom-adapter

How to create Custom spinner adapter with JSON Data?


When I load data to the spinner from a list data, it works. But When I create an adapter for spinner, it does not work. What is my problem?

Activity:

final FieldOfficerApiInterface apiService=OperatingApiClient.getClient().create(FieldOfficerApiInterface.class);

        Call<FieldOfficerApiResponse> call = apiService.getAllEOByBranchID(branchid);
        call.enqueue(new Callback<FieldOfficerApiResponse>() {
            @Override
            public void onResponse(Call<FieldOfficerApiResponse> call, Response<FieldOfficerApiResponse> response) {
                List<FieldOfficer> fieldofficerlist=response.body().getFieldofficerlist();
                Log.d(TAG,"Number of Fieldofficerlist received: "+fieldofficerlist.size());

                //*********DROPDOWN******************************************************

                final Spinner spnrFieldOfficer=(Spinner)findViewById(R.id.spinnerFieldOfficer);

                CustomSpinnerAdapter adapter=new CustomSpinnerAdapter(getApplicationContext(),fieldofficerlist);
                spnrFieldOfficer.setAdapter(adapter);

                //*********END DROPDOWN******************************************************
            }

            @Override
            public void onFailure(Call<FieldOfficerApiResponse> call, Throwable t) {
                // Log error here since request failed
                Log.e(TAG,t.toString());

            }
        });

CustomSpinnerAdapter:

public class CustomSpinnerAdapter extends BaseAdapter {

    private List<FieldOfficer> fieldOfficers;
    private Context context;
    LayoutInflater inflter;


    public CustomSpinnerAdapter(Context context, List<FieldOfficer> fieldOfficers) {
        this.context = context;
        this.fieldOfficers = fieldOfficers;
        this.inflter = (LayoutInflater.from(context));
    }

    @Override
    public int getCount() {
        return 0;
    }

    @Override
    public Object getItem(int position) {
        return null;
    }

    @Override
    public long getItemId(int position) {
        return 0;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        convertView=inflter.inflate(R.layout.custom_spinner_items,null);
        TextView tv=(TextView)convertView.findViewById(R.id.textView2);
        tv.setText(fieldOfficers.get(position).getFoname());
        return convertView;
    }
}

It works without Custom Adapter:

//*********DROPDOWN******************************************************
                ArrayAdapter<FieldOfficer> adapter;
                adapter = new ArrayAdapter<FieldOfficer>(getApplicationContext(), android.R.layout.simple_selectable_list_item,fieldofficerlist); //getApplication()
                //setting adapter to spinner
                spnrFieldOfficer.setAdapter(adapter);
//*********END DROPDOWN******************************************************

Solution

  • the spinner will call your getCount() to determine how many items is in the list, in your implementation you're telling it that the list is always empty.

    change your getCount() to the following

    @Override
        public int getCount() {
            if (fieldOfficers!= null) {
                return fieldOfficers.size();
            }
            return 0;
        }