Retrieve data from Spinner in the ListView

Viewed 382

I'm implementing a custom list view which has Spinner, i have TextView and others for each list item. And I want to get selected value of spinner for each row of list view. But all i get is first item of Spinner. Can anyone help with this?

I looked through many of posts here but all the answers requires to changing the code completely. I don't want to write all my code all over again.

Here is my custom adapter:

public class CustomAdapter extends ArrayAdapter<DataModel> {

    private ArrayList<DataModel> dataSet;
    Context mContext;

    private static class ViewHolder {
        TextView txtName;
        CheckBox checkBox;
        TextView price;
        Spinner spinner;
        DataModel data1;

    }

    public CustomAdapter(ArrayList<DataModel> data, Context context) {
        super(context, R.layout.row_item, data);
        this.dataSet = data;
        this.mContext = context;

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

    @Override
    public DataModel getItem(int position) {
        return dataSet.get(position);
    }


    @Override
    public View getView(int position, View convertView, @NonNull ViewGroup parent) {

        final ViewHolder viewHolder;
        final View result;

        if (convertView == null) {
            viewHolder = new ViewHolder();
            convertView = LayoutInflater.from(parent.getContext()).inflate(R.layout.row_item, parent, false);
            viewHolder.txtName = (TextView) convertView.findViewById(R.id.txtName);
            viewHolder.checkBox = (CheckBox) convertView.findViewById(R.id.checkBox);
            viewHolder.price = (TextView) convertView.findViewById(R.id.priceid);
            viewHolder.spinner = (Spinner) convertView.findViewById(R.id.spinner);

            viewHolder.spinner.setFocusable(false);

            result=convertView;
            convertView.setTag(viewHolder);

        } else {
            viewHolder = (ViewHolder) convertView.getTag();
            result=convertView;
        }

        final DataModel item = getItem(position);


        viewHolder.txtName.setText(item.name);
        viewHolder.checkBox.setChecked(item.checked);
        viewHolder.price.setText(item.price.toString());
        viewHolder.spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
            @Override
            public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) {
                item.setPortion(viewHolder.spinner.getSelectedItem().toString());
            }

            @Override
            public void onNothingSelected(AdapterView<?> adapterView) {

            }
        });



        return result;
    }
}

And my Data Model:

public class DataModel {

    public String name;
    public Double price;
    boolean checked;
    public String portion;

    public void setPortion(String portion) {
        this.portion = portion;
    }

    public String getPortion() {
        return portion;
    }

    public boolean isChecked() {
        return checked;
    }

    public void setChecked(boolean checked) {
        this.checked = checked;
    }

    public Double getPrice() {
        return price;
    }

    public String getName() {
        return name;
    }

    public DataModel(String name, Double price, boolean checked) {
        this.name = name;
        this.price = price;
        this.checked = checked;
    }

    public DataModel(String name) {
        this.name = name;
    }
}
0 Answers
Related