Selezionando un valore RadioButton e scorrimento indietro rimuovendo quello selezionato in RecyclerView

Nella mia applicazione sono presenti 20 domande a scelta multipla con l'aiuto di RecyclerView .

Se cambio il valore del primo RadioGroup e scorri verso il basso, RecycelarView nuovo fino a rimuovere il valore selezionato in RecycelarView e voglio anche utilizzare quel valore di RadioButton selezionato ulteriormente, mi è stato anche controllato link1 ma non ho capito cosa sta facendo.

  • Come get gmail posta in modo programmato in android
  • C'è qualcuno che integra ODOO con Android?
  • newInstance non riuscito: no <init>
  • errore: Nessun identificatore di risorse trovato per l'attributo 'textAlignment' nel pacchetto 'android'
  • Imansible trovare il progettista dell'interface utente nel nuovo Android Studio
  • Come sostituire una class all'interno di un progetto di libreria Android?
  • Ecco il frammento di codice di esempio per far sapere se hai bisogno di chiarimenti.

      package com.testing.survey; import java.util.List; import android.annotation.SuppressLint; import android.support.v7.widget.RecyclerView; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.RadioButton; import android.widget.RadioGroup; import android.widget.RadioGroup.OnCheckedChangeListener; import android.widget.TextView; @SuppressWarnings("rawtypes") public class DataAdapter extends RecyclerView.Adapter<DataAdapter.ViewHolder> { private List<Student> stList; public DataAdapter(List<Student> students) { this.stList = students; } // Create new views @Override public DataAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { // create a new view View itemLayoutView = LayoutInflater.from(parent.getContext()).inflate( R.layout.list_row, null); // create ViewHolder ViewHolder viewHolder = new ViewHolder(itemLayoutView); return viewHolder; } @SuppressLint("UseValueOf") @Override public void onBindViewHolder(ViewHolder viewHolder,int position) { final int pos = position; viewHolder.tvQuestionNumber.setText(stList.get(position).getQuestionNumber()); viewHolder.tvQuestion.setText(stList.get(position).getQuestion()); viewHolder.rbAns1.setText(stList.get(position).getAnswer1()); viewHolder.rbAns2.setText(stList.get(position).getAnswer2()); viewHolder.rbAns3.setText(stList.get(position).getAnswer3()); viewHolder.rbAns4.setText(stList.get(position).getAnswer4()); viewHolder.rbAns5.setText(stList.get(position).getAnswer4()); //viewHolder.rgAnswers.clearCheck(); viewHolder.rgAnswers.check(stList.get(position).getSelectedRadioButtonId()); viewHolder.rgAnswers.setTag(new Integer(position)); Log.v("select"+position,stList.get(position).getSelectedRadioButtonId()+""); viewHolder.rgAnswers.setOnCheckedChangeListener(new OnCheckedChangeListener() { @Override public void onCheckedChanged(RadioGroup group, int checkedId) { // TODO Auto-generated method stub int radioButtonID = group.getCheckedRadioButtonId(); View radioButton = group.findViewById(radioButtonID); int clickedPos = ((Integer)group.getTag()).intValue(); //Student contact=(Student)group.getTag(); //contact.setSelectedRadioButtonId(radioButtonID); stList.get(clickedPos).setSelectedRadioButtonId(radioButtonID); Log.v("hello"+clickedPos,stList.get(clickedPos).getSelectedRadioButtonId()+""); } }); } // Return the size arrayslist @Override public int getItemCount() { return stList.size(); } public static class ViewHolder extends RecyclerView.ViewHolder { public TextView tvQuestionNumber; public TextView tvQuestion; public RadioGroup rgAnswers; public RadioButton rbAns1,rbAns2,rbAns3,rbAns4,rbAns5; public Student singlestudent; public ViewHolder(View itemLayoutView) { super(itemLayoutView); tvQuestionNumber = (TextView) itemLayoutView.findViewById(R.id.tvQuestionNumber); tvQuestion = (TextView) itemLayoutView.findViewById(R.id.tvQuestion); rgAnswers=(RadioGroup)itemLayoutView.findViewById(R.id.rgAnswers); rbAns1=(RadioButton)itemLayoutView.findViewById(R.id.rbAnswer1); rbAns2=(RadioButton)itemLayoutView.findViewById(R.id.rbAnswer2); rbAns3=(RadioButton)itemLayoutView.findViewById(R.id.rbAnswer3); rbAns4=(RadioButton)itemLayoutView.findViewById(R.id.rbAnswer4); rbAns5=(RadioButton)itemLayoutView.findViewById(R.id.rbAnswer5); } } // method to access in activity after updating selection public List<Student> getStudentist() { return stList; } } 

  • $ .ajax POST ritorna "status": 403, "statusText": "Proibito" cordova android
  • Calcolare la velocità di movimento dell'utente in android
  • BroadcastReceivers in ICS
  • ImageView adjustViewBounds non funziona
  • Come rilevare la regione Enter / Exit per più fari utilizzando la libreria AltBeacon android-beacon?
  • Devono i nomi app di Android essere unici?
  • 9 Solutions collect form web for “Selezionando un valore RadioButton e scorrimento indietro rimuovendo quello selezionato in RecyclerView”

    Questo problema si verifica a causa di un bug in RecyclerView o in qualche parte nell' SDK Android. Comunque, ho preso il consiglio da un'altra domanda SO – onCheckedChanged chiamato automaticamente .

    Per RadioGroup , sarà un po 'diverso. Ci sono due modi per andare avanti. Raccommand la prima perché è plug-n-play.

    1. impostare OnCheckedChangeListener su RadioGroup :

       mRadioGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() { @Override public void onCheckedChanged(RadioGroup group, int checkedId) { if(checkedId == -1) { Log.v("onCheck", "Android bug since RadioButton doesn't get unchecked normally!"); } else { Log.v("onCheck", "Valid click. By user"); mMyListObjectArr[position].setChecked(checkedId); } } }); 
    2. o impostare onCheckedChangeListener su tutti i RadioButton s all'interno del RadioGroup :

       CompoundButton.OnCheckedChangeListener onCheckedChangeListener = new CompoundButton.OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { if(buttonView.isPressed()) { Log.v("onCheck", position + ", valid click by user"); mMyListObjectArr[position].setChecked(buttonView.getId()); } else { Log.v("onCheck", "Android bug"); } } }; mRadioButton1.setOnCheckedChangeListener(onCheckedChangeListener); mRadioButton2.setOnCheckedChangeListener(onCheckedChangeListener); 

    Puoi farlo in questo modo …..

    all'interno della tua class di fagioli aggiungere un field dire

     String final_answer; public String getFinalAnswer(){ return final_answer; } public void setFinalAnswer(String final_answer){ this.final_answer = final_answer; } 

    in adattatore …..

     public void onBindViewHolder(final ViewHolder viewHolder, final int position) { final Student student = stList.get(position); viewHolder.tvQuestionNumber.setText(student.getQuestionNumber()); viewHolder.tvQuestion.setText(student.getQuestion()); viewHolder.rbAns1.setText(student.getAnswer1()); viewHolder.rbAns2.setText(student.getAnswer2()); viewHolder.rbAns3.setText(student.getAnswer3()); viewHolder.rbAns4.setText(student.getAnswer4()); viewHolder.rbAns5.setText(student.getAnswer4()); viewHolder.rgAnswers.clearCheck(); if(student.getSelectedRadioButtonId()!=null) viewHolder.rgAnswers.check(student.getSelectedRadioButtonId()); else viewHolder.rgAnswers.clearCheck(); viewHolder.rgAnswers.setOnCheckedChangeListener(new OnCheckedChangeListener() { @Override public void onCheckedChanged(RadioGroup group, int checkedId) { if(checkedId != -1){ student.setSelectedRadioButtonId(checkedId); RadioButton rb = (RadioButton)viewHolder.rgAnswers. findViewById(checkedId); student.setFinalAnswer(rb.getText); stList.get(position) = student; } } }); } 

    Per get le risposte selezionate finalmente … scrivere questo codice nell'attività principale

      public void getSelectedAnswers(){ for(int i=0;i<slist.length;i++){ //get selected answer Log.i("answer",slist.get(i).getFinalAnswer()); } } 

    Modifica il tuo onBindViewHolder() a questo

     public void onBindViewHolder(ViewHolder viewHolder, int position) { final int pos = position; viewHolder.tvQuestionNumber.setText(stList.get(position).getQuestionNumber() + ""); viewHolder.tvQuestion.setText(stList.get(position).getQuestion()); viewHolder.rbAns1.setText(stList.get(position).getAnswer1()); viewHolder.rbAns2.setText(stList.get(position).getAnswer2()); viewHolder.rbAns3.setText(stList.get(position).getAnswer3()); viewHolder.rbAns4.setText(stList.get(position).getAnswer4()); viewHolder.rbAns5.setText(stList.get(position).getAnswer5()); //viewHolder.rgAnswers.clearCheck(); viewHolder.rgAnswers.setTag(position); Log.v("select" + position, stList.get(position).getSelectedRadioButtonId() + ""); viewHolder.rgAnswers.setOnCheckedChangeListener(new OnCheckedChangeListener() { @Override public void onCheckedChanged(RadioGroup group, int checkedId) { // TODO Auto-generated method stub int radioButtonID = group.getCheckedRadioButtonId(); View radioButton = group.findViewById(radioButtonID); int clickedPos = (Integer) group.getTag(); stList.get(clickedPos).setSelectedRadioButtonId(radioButtonID); // if you want to get selected button's info such as tag, text... etc. RadioButton radioButton = (RadioButton) viewHolder.itemView.findViewById(radioButtonID); if(radioButton != null) { String customTag = radioButton.getTag().toString(); stList.get(clickedPos).setCustomTag(customTag); } Log.v("hello" + clickedPos, stList.get(clickedPos).getSelectedRadioButtonId() + ""); } }); viewHolder.rgAnswers.check(stList.get(position).getSelectedRadioButtonId()); } 

    Dovrebbe funzionare. Se si prega di contattarmi, per favore.

    Ho creato un codice di esempio che funziona come per il tuo req.

    Innanzitutto dobbiamo creare il xml come segue:

      <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <android.support.v7.widget.RecyclerView android:id="@+id/recyclerViewAppList" android:layout_width="match_parent" android:layout_height="match_parent" app:layout_behavior="@string/appbar_scrolling_view_behavior" /> </LinearLayout> 

    Quindi creeremo un'interface come segue

     public interface OnOptionSelected { public void onOptionSelected(int position,int itemSelected); } 

    Quindi creeremo la class del model come segue:

     public class QuestionModel { private String question; private int seleectedAnswerPosition; private boolean op1Sel,op2Sel,op3Sel; // options public boolean isOp1Sel() { return op1Sel; } public void setOp1Sel(boolean op1Sel) { this.op1Sel = op1Sel; if(op1Sel){ // To make sure only one option is selected at a time setOp2Sel(false); setOp3Sel(false); } } public boolean isOp2Sel() { return op2Sel; } public void setOp2Sel(boolean op2Sel) { this.op2Sel = op2Sel; if(op2Sel){ setOp1Sel(false); setOp3Sel(false); } } public boolean isOp3Sel() { return op3Sel; } public void setOp3Sel(boolean op3Sel) { this.op3Sel = op3Sel; if(op3Sel){ setOp2Sel(false); setOp1Sel(false); } } public int getSeleectedAnswerPosition() { return seleectedAnswerPosition; } public void setSeleectedAnswerPosition(int seleectedAnswerPosition) { this.seleectedAnswerPosition = seleectedAnswerPosition; } public String getQuestion() { return question; } public void setQuestion(String question) { this.question = question; } } 

    Quindi creeremo la vista per la row:

     <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <TextView android:id="@+id/question" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <RadioButton android:id="@+id/radoptionOne" android:text="May Be" android:checked="false" android:saveEnabled="true" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <RadioButton android:checked="false" android:id="@+id/radoptionTwo" android:text="NO" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <RadioButton android:checked="false" android:id="@+id/radoptionThree" android:text="Yes" android:layout_width="wrap_content" android:layout_height="wrap_content" /> </LinearLayout> 

    Classe adattatore come segue:

      public class QuestionAdapter extends RecyclerView.Adapter<QuestionAdapter.ViewHolder> { private List<QuestionModel> questionModels; public void setOnOptionSelected(OnOptionSelected onOptionSelected) { this.onOptionSelected = onOptionSelected; } private OnOptionSelected onOptionSelected; public List<QuestionModel> getQuestionModels() { return questionModels; } public void setQuestionModels(List<QuestionModel> questionModels) { this.questionModels = questionModels; } public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener { TextView question; RadioGroup radioGroup; RadioButton op1, op2, op3; ViewHolder(View view) { super(view); question = (TextView) view.findViewById(R.id.question); //radioGroup=(RadioGroup)view.findViewById(R.id.radGroup); op1 = (RadioButton) view.findViewById(R.id.radoptionOne); op2 = (RadioButton) view.findViewById(R.id.radoptionTwo); op3 = (RadioButton) view.findViewById(R.id.radoptionThree); op1.setOnClickListener(this); op2.setOnClickListener(this); op3.setOnClickListener(this); } @Override public void onClick(View view) { switch (view.getId()) { case R.id.radoptionOne: onOptionSelected.onOptionSelected(getAdapterPosition(), 1); break; case R.id.radoptionTwo: onOptionSelected.onOptionSelected(getAdapterPosition(), 2); break; case R.id.radoptionThree: onOptionSelected.onOptionSelected(getAdapterPosition(), 3); break; } } } @Override public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View v; // create a normal view v = LayoutInflater.from(parent.getContext()) .inflate(R.layout.row_view, parent, false); return new ViewHolder(v); } @Override public void onBindViewHolder(ViewHolder viewHolder, final int position) { viewHolder.question.setText(questionModels.get(position).getQuestion()); Log.e("POSITION" + position, "1" + questionModels.get(position).isOp1Sel()); Log.e("POSITION" + position, "2" + questionModels.get(position).isOp2Sel()); Log.e("POSITION" + position, "3" + questionModels.get(position).isOp3Sel()); viewHolder.op1.setChecked(questionModels.get(position).isOp1Sel()); viewHolder.op2.setChecked(questionModels.get(position).isOp2Sel()); viewHolder.op3.setChecked(questionModels.get(position).isOp3Sel()); } @Override public int getItemCount() { if (questionModels != null) { return questionModels.size(); } return 0; } } 

    Quindi la class Attività:

     public class MainActivity extends Activity implements OnOptionSelected{ private RecyclerView mRecyclerView; private List<QuestionModel> questionModels; private QuestionAdapter questionAdapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mRecyclerView =(RecyclerView)findViewById(R.id.recyclerViewAppList); mRecyclerView.setHasFixedSize(true); questionModels=new ArrayList<QuestionModel>(); for (int i=0;i<20;i++) { QuestionModel questionModel=new QuestionModel(); questionModel.setQuestion("Question " + (i + 1)); questionModels.add(questionModel); } questionAdapter =new QuestionAdapter(); questionAdapter.setOnOptionSelected(this); LinearLayoutManager layoutManager = new LinearLayoutManager(this); layoutManager.setOrientation(LinearLayoutManager.VERTICAL); questionAdapter.setQuestionModels(questionModels); mRecyclerView.setLayoutManager(layoutManager); mRecyclerView.setAdapter(questionAdapter); } @Override public void onOptionSelected(int position, int itemSelected) { questionModels.get(position).setSeleectedAnswerPosition(itemSelected); switch (itemSelected){ case 1: questionModels.get(position).setOp1Sel(true); break; case 2: questionModels.get(position).setOp2Sel(true); break; case 3: ((QuestionModel)questionModels.get(position)).setOp3Sel(true); break; } questionAdapter.setQuestionModels(questionModels); questionAdapter.notifyDataSetChanged(); // mRecyclerView.setAdapter(questionAdapter); } } 

    Mi è stato provato la soluzione con Radiogroup ma non funzionava correttamente (qualche volta era mantenendo il vecchio valore). Poi ho cambiato il modo delle opzioni di selezione nella mia class di model.

    campione

    Il problema è che la vista del riciclatore è il riciclaggio (come il nome dice) le tue opinioni.

    Il sistema crea una certa quantità di ViewHolders per riempire lo schermo dopo aver raggiunto tale sum che riutilizza i già esistenti ViewHolders.

    Se si imposta il button selezionato nella prima list e si utilizza nuovamente il ViewHolder per la settima list, il button è ancora selezionato (perché è stato impostato nel visualizzatore).

    Per risolvere questo problema, è necessario impostare l'aspetto predefinito per le listener in onBindViewHOlder each volta.

    Aggiornare:

     public void onBindViewHolder(final ViewHolder viewHolder, final int position) { final Student student = stList.get(position); viewHolder.tvQuestionNumber.setText(student.getQuestionNumber()); viewHolder.tvQuestion.setText(student.getQuestion()); viewHolder.rbAns1.setText(student.getAnswer1()); viewHolder.rbAns2.setText(student.getAnswer2()); viewHolder.rbAns3.setText(student.getAnswer3()); viewHolder.rbAns4.setText(student.getAnswer4()); viewHolder.rbAns5.setText(student.getAnswer4()); viewHolder.rgAnswers.clearCheck(); viewHolder.rgAnswers.check(student.getSelectedRadioButtonId()); viewHolder.rgAnswers.setOnCheckedChangeListener(new OnCheckedChangeListener() { @Override public void onCheckedChanged(RadioGroup group, int checkedId) { student.setSelectedRadioButtonId(checkedId); Log.v("hello"+position,checkedId+""); } }); } 

    Ho leggermente aggiornato il tuo nuovo approccio, forse questo aiuta?

    Come ho visto il tuo codice …

    basta aggiungere una row singola

    viewHolder.rgAnswers.setOnCheckedChangeListener(null);

    in metodo onBindViewHolder() sopra di questa linea

    viewHolder.rgAnswers.check(stList.get(position).getSelectedRadioButtonId());

    se risolve il tuo problema … mi so … ti spiegherò uno scenario per il suo evento .. Perché ho affrontato il problema di similer e risolto utilizzando questa soluzione.

    Nella class del model aggiungere

     private int checkedId = -1; public int getCheckedId() { return checkedId; } public void setCheckedId(int checkedId) { this.checkedId = checkedId; } 

    e cambiare onBindViewHolder in adattatore come questo:

      @Override public void onBindViewHolder(ViewHolder viewHolder, final int position) { viewHolder.tvQuestion.setText(stList.get(position).getQuestion()); viewHolder.rbAns1.setText(stList.get(position).getAnswer1()); viewHolder.rbAns2.setText(stList.get(position).getAnswer2()); viewHolder.rbAns3.setText(stList.get(position).getAnswer3()); viewHolder.rbAns4.setText(stList.get(position).getAnswer4()); viewHolder.rbAns5.setText(stList.get(position).getAnswer5()); viewHolder.radGrp.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() { @Override public void onCheckedChanged(RadioGroup rgp, int checkedId) { // TODO Auto-generated method stub stList.get(position).setCheckedId(rgp.getCheckedRadioButtonId()); } }); viewHolder.radGrp.check(stList.get(position).getCheckedId()); } 

    All'interno della class studenti aggiungere una variabile booleana è selezionata. Adesso su checkedChangeListener di each radiogruppo, modificare il valore di isSelected per segnare se è stato selezionato un valore o non è stata selezionata nessuna selezione. Ora all'interno di onBindViewHolder () è sufficiente

      if(stList.get(position).isSelected){ viewHolder.rgAnswers.check(stList.get(position).getSelectedRadioButtonId()); }else{ viewHolder.rgAnswers.clearCheck(); } 

    Alla fine è ansible eseguire iterazioni su tutta la list e verificare quali oggetti è selezionato è vero

    RecyclerView è venuto su ListView e la sua properties; principale che è esso riutilizza le celle mentre scrollano su e giù. A causa di questo, non scorrimento mentre scorrimento anche se si dispone di un sacco di dati nella tua list. Hai problemi a causa del riutilizzo di celle in RecyclerView.

    È ansible superare questo problema associando i dati dell'elenco RecyclerView alla class Modal con il metodo getter e setter. È ansible visualizzare la checkbox controllo selezionata o distriggersta sulla base della posizione della cella e dei dati corrispondenti. Nel mio esempio ho usato setOnClickListener invece di setOnCheckedChangeListenerto per mostrare la casella di controllo selezionata o non selezionata.

    L'Android è un fan Android di Google, tutto su telefoni Android, Android Wear, Android Dev e applicazioni Android Games e così via.