Agregué Spinner dentro de RecyclerView, cuando estoy tratando de obtener datos de elementos seleccionados con ruleta, obtengo otros datos de posición / incorrectos, cualquiera me sugiere que obtenga el elemento seleccionado y la posición correctos de {{X2} } onItemSelected

Aquí está mi código

@Override
public void onBindViewHolder(final QuestionHolder holder, final int position) {
        if (position % 2 == 1)
            holder.itemView.setBackgroundColor(Color.parseColor("#F8F8F8"));
        adapter = new ArrayAdapter<Option>(binding.getRoot().getContext(),
                        R.layout.item_spinner, questionList.get(position).getOptions());
        adapter.setDropDownViewResource(R.layout.item_spinner);
        binding.optionSpinner.setAdapter(adapter);

        binding.serialNo.setText((position + 1) + ".");
        binding.setQuestion(questionList.get(position));
        binding.executePendingBindings();
        binding.optionSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
            @Override
            public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
                Toast.makeText(holder.itemView.getContext(), position+" : "+binding.optionSpinner.getSelectedItem().toString(), Toast.LENGTH_SHORT).show();
                spinnerData.setSelectedData(position, binding.optionSpinner.getSelectedItem().toString());
            }

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

            }
        });

    }
3
srinu 15 nov. 2017 a las 11:30

2 respuestas

La mejor respuesta

Creo que tienes que probar esto

  showSpinnerList.setOnItemSelectedListener(new 
         AdapterView.OnItemSelectedListener() {
            @Override
            public void onItemSelected(AdapterView<?> parent, View view, int 
               position, long id) {
                // On selecting a spinner item

                String item = parent.getItemAtPosition(position).toString();

            }

            @Override
            public void onNothingSelected(AdapterView<?> parent) {
                // todo for nothing selected
            }
        });
4
Sandeep Sankla 15 nov. 2017 a las 08:55

Compruebe esto, puede ser útil y puede solucionar su problema. Si esto no soluciona su problema, al menos se deshace del error Lint. Error de pelusa "No trate la posición como fija; úsela solo de inmediato ...". Entonces, en todos los lugares donde esté usando final int position** cámbielo a getAdapterPosition();

La documentación de RecyclerView.Adapter.onBindViewHolder () estados:

Tenga en cuenta que, a diferencia de ListView, RecyclerView no llamará a este método de nuevo si la posición del elemento cambia en el conjunto de datos a menos que el el artículo en sí se invalida o no se puede determinar la nueva posición. Por esta razón, solo debe usar el parámetro de posición mientras adquirir el elemento de datos relacionado dentro de este método y no debe mantener una copia del mismo. Si necesita la posición de un artículo más adelante (por ejemplo, en un haga clic en el oyente), use getAdapterPosition () que tendrá la actualización posición del adaptador

Por lo tanto, técnicamente los artículos se pueden reorganizar y la vinculación no será necesario porque los elementos aún no están invalidados. El position La variable recibida es verdadera solo para el alcance de la función de vinculación y no siempre apuntará a la posición correcta en el conjunto de datos. Es por eso la función getAdapterPosition() debe llamarse cada vez que se actualiza se necesita una posición.

En mi humilde opinión, mLastPosition = holder.getAdapterPosition(); todavía está potencialmente incorrecto. Porque el artículo se puede reorganizar y mLastPosition todavía apunta a una posición anterior.

Acerca de por qué lint guarda silencio, quizás la regla de Lint no sea tan completa. Sus solo verificando si el parámetro position se está copiando o no.

0
svkaka 15 nov. 2017 a las 09:03