4

Below is xml declaration of spinner:

<Spinner
android:id="@+id/spnReasonActApplyLeave"
style="@style/Widget.AppCompat.Spinner.Underlined"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/dimen_20_dp" />

Below is initialization in activity class:

var adapterReasons: LeaveReasonSpinnerAdapter ?= null    
adapterReasons = LeaveReasonSpinnerAdapter(this,R.layout.row_reason_spinner_item, reasonList)   
 spnReasonActApplyLeave.adapter = adapterReasons

spnReasonActApplyLeave.setOnItemSelectedListener(object: AdapterView.OnItemSelectedListener {
            override fun onItemSelected(parent: AdapterView<*>?, view: View?, position: Int, id: Long) {
                Log.e("ApplyLeave", "Selected Reason: "+reasonList.get(position))
            }

            override fun onNothingSelected(parent: AdapterView<*>?) {

            }
        })

Below is row_reason_spinner_item xml file:

<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/tvReasonRowReasonSpinner"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:textColor="@color/black"
    android:textSize="@dimen/txt_16_sp" />

Below is LeaveReasonSpinnerAdapter class:

public class LeaveReasonSpinnerAdapter extends ArrayAdapter<LeaveReasonListPayloadDataResponse> {

    private final LayoutInflater mInflater;
    private Context mContext;
    int layoutResourceId;
    private List<LeaveReasonListPayloadDataResponse> data = new ArrayList<>();

    public LeaveReasonSpinnerAdapter(Context context, int resource, ArrayList<LeaveReasonListPayloadDataResponse> list) {
        super(context, resource, list);
        mContext = context;
        mInflater = LayoutInflater.from(context);
        layoutResourceId = resource;
        data = list;
    }

    @Override
    public View getDropDownView(int position, View convertView, ViewGroup parent) {
        return createItemView(position, convertView, parent);
    }

    @Override
    public int getCount() {
        return data.size();
    }

    @Override
    public LeaveReasonListPayloadDataResponse getItem(int position) {
        return data.get(position);
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        return createItemView(position, convertView, parent);
    }

    private View createItemView(int position, View convertView, ViewGroup parent){
        View view = mInflater.inflate(layoutResourceId, parent, false);

        TextView label = (TextView) view.findViewById(R.id.tvReasonRowReasonSpinner);

        LeaveReasonListPayloadDataResponse offerData = data.get(position);

        label.setText(offerData.getReason());
        label.setTextColor(ContextCompat.getColor(mContext, R.color.black));
//        label.setBackgroundColor(ContextCompat.getColor(mContext, R.color.black));

        return view;
    }
}

i tried many things. i also implemented appcompatspinner but still no luck in it. when i select spinner that time i can see values in dropdown but not after selecting any item.

There is also another issue in it. setonitemselectedlistener of that spinner is also not called.

Below is output: enter image description here enter image description here

Sagar Maiyad
  • 12,655
  • 9
  • 63
  • 99

1 Answers1

0

When you bind your adapter that time adapter has value then it shows in spinner. Use below code for example:

   var adapterReasons: LeaveReasonSpinnerAdapter?= null
    var reasonList= arrayListOf<LeaveReasonListPayloadDataResponse>() // bind your any type of data
    // used below code in for loop
    var data=LeaveReasonListPayloadDataResponse().apply {
        reason="Hello"
    }
    var data2=LeaveReasonListPayloadDataResponse().apply {
        reason="Hello2"
    }

    reasonList.add(data)
    reasonList.add(data2)
    adapterReasons = LeaveReasonSpinnerAdapter(this,
            R.layout.row_layout, reasonList)
    var SpinnerValue:Spinner=findViewById(R.id.spnReasonActApplyLeave)
    SpinnerValue.adapter = adapterReasons
    SpinnerValue.onItemSelectedListener = object : OnItemSelectedListener {
        override fun onItemSelected(parentView: AdapterView<*>, selectedItemView: View, position: Int, id: Long) {
            Toast.makeText(applicationContext,""+SpinnerValue.selectedItemPosition.toString(),Toast.LENGTH_SHORT).show()
        }

        override fun onNothingSelected(parentView: AdapterView<*>) {
        }

    }

Use this code in your activity onCreate().

Ted Nyberg
  • 7,001
  • 7
  • 41
  • 72