Search code examples
androidandroid-recyclerviewandroid-spinner

Problem with spinner in Recyclerview android


Recyclerview item contains spinner and textviews. All item's spinners are correctly set. Whenever ith item spinner changes, ith item textviews values will also be changed. The problem here is, one item spinner click action changes other items spinner values.

Adapter class:

public void onBindViewHolder(@NonNull final MyViewHolder holder, final int position) {

    //do not re-initialize spinner when behaviour of item is changing
        if (holder.spinnerWeightUnit.getAdapter() == null) {

            List<String> unit_list = new ArrayList<>();
                for (Productsku x : productskuList) {
                    unit_list.add(x.getWeight() + x.getUnit());
                }
                initializeUnitSpinner(holder.spinnerWeightUnit, unit_list);
                holder.spinnerWeightUnit.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
                    @Override
                    public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) {
                        Timber.d("adapter item changed");
                        setPriceStockValues(holder, position, i);
                    }
                    @Override
                    public void onNothingSelected(AdapterView<?> adapterView) {}
                });
            }
}

private void initializeUnitSpinner(Spinner spinnerUnit, List<String> unit_list) {
        ArrayAdapter<String> unitArrayAdapter = new ArrayAdapter<>(mContext, android.R.layout.simple_spinner_item, unit_list);
        unitArrayAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        spinnerUnit.setAdapter(unitArrayAdapter);
}

private void setPriceStockValues(MyViewHolder holder, int position, int unit_position) {
    //set textviews
}

scenario:

  1. 0th item spinner value selected -> all spinners are correct
  2. 1st item spinner value selected -> all spinners are correct
  3. again 0th item spinner value selected -> all spinners are set to 1st item's spinner values
  4. again 1st item spinner values selected -> all spinner are set to 0th item's spinner values ..and so on.

I am unable to find out the solution for this. Please any one can help? Thank you.


Solution

  • try with removing this line

    if (holder.spinnerWeightUnit.getAdapter() == null)
    

    set up your adapter every time when onBindViewHolder get called. RecyclerView uses recycling pattern - reusing previously used/shown Views/ViewHolders. above if prevents to re-set paticluar item on proper position, keeps old OnItemSelected listener and adapter