Как избежать проверки RadioGroup дважды в RecyclerView - PullRequest
0 голосов
/ 22 октября 2019

Я заметил, RecyclerView "перезапускает" представления в адаптере, но я хочу остановить адаптер RecyclerView, дублирующий проверенное действие в другом элементе RecyclerView.

У меня в RecyclerView 10 элементов, каждый из которых имеет RadioGroup с двумя RadioButton внутри, но когда я запустил проверку в первом элементе, например, элемент номер десять тоже проверил.

Я читал этот вопрос, но у меня не получилось, чтобы он заработал.

Использование переключателя с обзором реселлера в Android

Как этого избежать?

Мой адаптер:

...

public class PreguntaAdapter extends RecyclerView.Adapter<PreguntaAdapter.ViewHolder> {
    private Context context;
    private ArrayList<VistaEncuestaActivity.PreguntasSiNo> preguntas;
    public ArrayList<Respuestas> respuestas = new ArrayList<Respuestas>();
    public PreguntaAdapter(Context context, ArrayList<VistaEncuestaActivity.PreguntasSiNo> preguntas) {
        this.context = context;
        this.preguntas = preguntas;
    }

    public ArrayList<Respuestas> getCheckedItems() {
        return respuestas;
    }

    @NonNull
    @Override
    public PreguntaAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
        Context context = viewGroup.getContext();
        LayoutInflater layoutInflater = LayoutInflater.from(context);
        View v = layoutInflater.inflate(R.layout.item_pregunta_sino, viewGroup, false);
        ViewHolder viewHolder = new ViewHolder(v);

        return viewHolder;
    }


    @Override
    public void onBindViewHolder(@NonNull final PreguntaAdapter.ViewHolder viewHolder, int i) {
        final VistaEncuestaActivity.PreguntasSiNo currentPregunta = preguntas.get(i);
        //viewHolder.pregunta.setText(currentEncuesta.getString_pregunta());
        viewHolder.pregunta.setText(currentPregunta.getQuestion());

        viewHolder.myLinearLayout.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

            }
        });

        viewHolder.setIsRecyclable(false);

    }

    @Override
    public int getItemCount() {
        return preguntas.size();
    }

    public class ViewHolder extends RecyclerView.ViewHolder {
        public SharedPreferences prefs;
        private LinearLayout myLinearLayout;
        public TextView pregunta;
        public RadioGroup radio_group;
        public ViewHolder(@NonNull View itemView) {
            super(itemView);
            pregunta = (TextView) itemView.findViewById(R.id.pregunta);
            radio_group = (RadioGroup) itemView.findViewById(R.id.radio_group_pregunta);
            prefs = (SharedPreferences) context.getSharedPreferences("logged", Context.MODE_PRIVATE);
            myLinearLayout = (LinearLayout) itemView.findViewById(R.id.myLinearLayout);
        }
    }
}

Ответы [ 2 ]

0 голосов
/ 23 октября 2019

Спасибо всем за ваши ответы. К сожалению, любой ответ помог мне решить эту проблему, я использовал эту функцию и добавил функцию getItemViewType к своему адаптеру, и теперь она работает хорошо:

@Override
public int getItemViewType(int position) {
  return position;
}

И, перейдя к официальным документам Google, я смог найтиследующая информация:

Возвращает вид вида позиции в позиции для целей переработки вида. Реализация этого метода по умолчанию возвращает 0, делая предположение об одном типе представления для адаптера. В отличие от адаптеров ListView, типы не обязательно должны быть смежными. Рассмотрите возможность использования ресурсов id для уникальной идентификации типов представлений элементов. https://developer.android.com/reference/android/support/v7/widget/RecyclerView.Adapter

Это имеет смысл в то время, когда RecyclerView "перезаписывает" представления, но при использовании его в адаптере это ведет себя по-разному, рассматривая каждое представление как уникальное.

Спасибо всем вам.

0 голосов
/ 22 октября 2019

RadioGroup.getCheckedRadioButtonId() это путь. В сочетании с SparseArray<Integer>.

In onBindViewHolder(): для каждой радиогруппы установите RadioGroup.OnCheckedChangeListener(). Добавьте проверенное состояние в a SparseArray или Map<Integer,Integer>, сопоставляя индекс позиции элемента с обновленным значением в RadioGroup.OnCheckedChangeListener() onCheckedChanged.

Таким образом, ваш onBindViewHolder будет выглядеть примерно так:

private SparseArray<Integer> mMapping = new SparseArray<>();

public void onBindViewHolder(@NonNull final PreguntaAdapter.ViewHolder viewHolder,final int position) {
        final VistaEncuestaActivity.PreguntasSiNo currentPregunta = preguntas.get(i);
        //viewHolder.pregunta.setText(currentEncuesta.getString_pregunta());
        viewHolder.pregunta.setText(currentPregunta.getQuestion());

        viewHolder.myLinearLayout.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

            }
        });

        viewHolder.radio_group.setOnCheckedChangeListener(new OnCheckedChangeListener(){
           void onCheckedChanged(RadioGroup group,int checked) {
          mMapping.put(position,checked);
     }
}};

       // Check to see if a previous checked value exists and restore.
        if(mMapping.get(position) != null && mMapping.get(position) != -1){
           radio_group.check(mMapping.get(position));
}

        viewHolder.setIsRecyclable(false);

    }


onCheckedChanged(RadioGroup group, int checkedId)

Вы должны дать каждому RadioButton уникальный идентификатор, например radioButton_1, radioButton_2, в файле макета.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...