0

У меня есть Recycler вид с группой радио и его 4 переключателя. но когда я просматриваю список, средний элемент действует как первый. означает, что если у меня есть 10 предметов, если выбрать первую кнопку элемента, тогда кнопка 6 также получит выбор с выбором пользователя.выбор радиокнопки в Radio Group в режиме Recycler в android?

что делать для выпуск в виде ресайлера. Любые предложения будут заметны. Спасибо заранее.

enter code here 
public class ViewHolder extends RecyclerView.ViewHolder { 
    TextView quest, timestamp, answer; 
    RadioGroup rg; 
    RadioButton rb1, rb2, rb3, rb4; 
    Button submit; 
    public ViewHolder(View view) { 
     super(view); 
     quest = (TextView) itemView.findViewById(R.id.ques); 
     timestamp = (TextView) itemView.findViewById(R.id.tym); 
     answer = (TextView) itemView.findViewById(R.id.answer); 
     rb1 = (RadioButton)itemView.findViewById(R.id.rb1); 
     rb2 = (RadioButton)itemView.findViewById(R.id.rb2); 
     rb3 = (RadioButton)itemView.findViewById(R.id.rb3); 
     rb4 = (RadioButton)itemView.findViewById(R.id.rb4); 
     rb4 = (RadioButton)itemView.findViewById(R.id.rb4); 
     rg = (RadioGroup)itemView.findViewById(R.id.radio); 
     submit = (Button)itemView.findViewById(R.id.submit); 


     rg.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() { 
      @Override 
      public void onCheckedChanged(RadioGroup group, int checkedId) { 
       int radioButtonID = group.getCheckedRadioButtonId(); 
       View radioButton = group.findViewById(radioButtonID); 
       int clickedPos= (int) group.getTag(); 
       Log.v("currentpos",""+clickedPos); 
       messageArrayList.get(clickedPos).setSelectedRadioButtonId(checkedId); 
       int radioId = group.indexOfChild(radioButton); 
       RadioButton btn = (RadioButton) group.getChildAt(radioId); 
       final int currentPosition = getAdapterPosition(); 
       if (messageArrayList.get(clickedPos).getSelectedRadioButtonId() != -1 && checkedId != -1) { 
        try { 

         String selection = btn.getText().toString(); 
         if (selection.equalsIgnoreCase(messageArrayList.get(clickedPos).getAnswer().toString())) { 
          Log.v("TAG", "USER OPTION" + "\t" + selection + "\n" + "CORRECT ANSWER IS" + "\t" + messageArrayList.get(clickedPos).getAnswer()); 
          // rg.setVisibility(View.INVISIBLE); 
          // answer.setVisibility(View.VISIBLE); 
          // answer.setText("Congrats, you are right. The answer is " + messageArrayList.get(clickedPos).getAnswer().toString()); 


        Toast.makeText(group.getContext(), "YOu are Right", Toast.LENGTH_SHORT).show(); 
        } else { 
          // rg.setVisibility(View.INVISIBLE); 
          // answer.setVisibility(View.VISIBLE); 
          // answer.setText("Oops, you're wrong, the correct answer is " + messageArrayList.get(clickedPos).getAnswer().toString()); 

          Toast.makeText(group.getContext(), "You are Worng", Toast.LENGTH_SHORT).show(); 
         } 
         Log.v("hello", selection); 
         String qusnn = quest.getText().toString(); 
         Log.v("question", qusnn); 
         String read = "1"; 
         try { 
          helper = new DBHelper(group.getContext()); 
          database = helper.getWritableDatabase(); 
          statement = database.compileStatement("update quiz set USERANS =? where QUESTION ='" + qusnn + "'"); 
          statement.bindString(1, read); 
          statement.executeInsert(); 
          database.close(); 
         } catch (Exception e) { 
          e.printStackTrace(); 
          System.out.println("exception for send data in table"); 
         } finally { 
          database.close(); 
         } 

        } catch (Exception e) { 
         StringWriter sw = new StringWriter(); 
         e.printStackTrace(new PrintWriter(sw)); 
         String exceptionAsString = sw.toString(); 
         Log.v("hello", exceptionAsString); 
        } 
        Log.v("hello" + clickedPos, messageArrayList.get(clickedPos).getSelectedRadioButtonId() + ""); 


       } 

      }}); 

    } 
} 


public ChatRoomThreadAdapter(ArrayList<Message> messageArrayList) { 

    this.messageArrayList = messageArrayList; 

    Calendar calendar = Calendar.getInstance(); 
    today = String.valueOf(calendar.get(Calendar.DAY_OF_MONTH)); 
} 

@Override 
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
    View itemView; 
    if (viewType == SELF) { 

     itemView = LayoutInflater.from(parent.getContext()) 
       .inflate(R.layout.recycler_items, parent, false); 
    }else{ 

     itemView = LayoutInflater.from(parent.getContext()) 
       .inflate(R.layout.secondlayout, parent, false); 
    } 


    return new ViewHolder(itemView); 
} 

@Override 
public int getItemViewType(int position) { 
    Message message = messageArrayList.get(position); 
    if (message.getUsans().equals("0")) { 
     return SELF; 
    } 

    return position; 
} 

@Override 
public void onBindViewHolder(final RecyclerView.ViewHolder holder,final int position) { 
final Message message = messageArrayList.get(position); 
    ((ViewHolder) holder).quest.setText(message.getMessage()); 
    ((ViewHolder) holder).rb1.setText(message.getOpt1()); 
    ((ViewHolder) holder).rb2.setText(message.getOpt2()); 
    ((ViewHolder) holder).rb3.setText(message.getOpt3()); 
    ((ViewHolder) holder).rb4.setText(message.getOpt4()); 
    ((ViewHolder) holder).answer.setText(message.getAnswer()); 
    String timestam= getTimeStamp(message.getCreatedAt()); 
    ((ViewHolder) holder).timestamp.setText(timestam); 
    // ((ViewHolder) holder).rg.clearCheck(); 
    // ((ViewHolder) holder).rg.setTag(position); 
    // Log.e("select" + position, messageArrayList.get(position).getSelectedRadioButtonId() + ""); 

    ((ViewHolder) holder).rg.setTag(position); 
    if (message.getSelectedRadioButtonId()!= -1){ 

     ((ViewHolder) holder).rg.check(message.getSelectedRadioButtonId()); 


    }else{ 
     //your always need to write else condition 
     ((ViewHolder) holder).rg.clearCheck(); 
    } 

} 

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


public static String getTimeStamp(String dateStr) { 
    SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 
    String timestamp = ""; 

    today = today.length() < 2 ? "0" + today : today; 

    try { 
     Date date = format.parse(dateStr); 
     SimpleDateFormat todayFormat = new SimpleDateFormat("dd"); 
     String dateToday = todayFormat.format(date); 
     format = dateToday.equals(today) ? new SimpleDateFormat("hh:mm a") : new SimpleDateFormat("dd LLL, hh:mm a"); 
     String date1 = format.format(date); 
     timestamp = date1.toString(); 
    } catch (ParseException e) { 
     e.printStackTrace(); 
    } 

    return timestamp; 
} 

}

enter code here

 public class Message implements Serializable { 
String id, message, opt1, opt2, opt3, opt4, answer, createdAt,usans; 


public Message() { 
} 

public Message(String id, String message, String opt1, String opt2, String opt3, String opt4, String answer, String createdAt,String usans) { 
    this.id = id; 
    this.message = message; 
    this.opt1 = opt1; 
    this.opt2 = opt2; 
    this.opt3 = opt3; 
    this.opt4 = opt4; 
    this.answer = answer; 
    this.createdAt = createdAt; 
    this.usans = usans; 
} 
private int checkedId = -1; 

public int getSelectedRadioButtonId() { 
    return checkedId; 
} 

public void setSelectedRadioButtonId(int checkedId) { 
    this.checkedId = checkedId; 
} 

public String getUsans() { 
    return usans; 
} 

public void setUsans(String usans) { 
    this.usans = usans; 
} 
public String getId() { 
    return id; 
} 

public void setId(String id) { 
    this.id = id; 
} 

public void setOpt1(String opt1) { 
    this.opt1 = opt1; 
} 

public String getOpt1() { 
    return opt1; 
} 

public void setOpt2(String opt2) { 
    this.opt2 = opt2; 
} 

public String getOpt2() { 
    return opt2; 
} 

public void setOpt3(String opt3) { 
    this.opt3 = opt3; 
} 

public String getOpt3() { 
    return opt3; 
} 

public void setOpt4(String opt4) { 
    this.opt4 = opt4; 
} 

public String getOpt4() { 
    return opt4; 
} 

public void setAnswer(String answer) { 
    this.answer = answer; 
} 

public String getAnswer() { 
    return answer; 
} 

public String getMessage() { 
    return message; 
} 

public void setMessage(String message) { 
    this.message = message; 
} 

public String getCreatedAt() { 
    return createdAt; 
} 

public void setCreatedAt(String createdAt) { 
    this.createdAt = createdAt; 
} 

}         
+0

Это может быть связано с тем, что ячейки перерабатываются или повторно используются. Поскольку вы уже сделали выбор, метод bindviewholder не перезагружает радиогруппу и не использует существующую. – Bhushan

+0

как я могу это сделать? – latha

+1

Ну. Если вы используете правильный MVC для кодирования, вы можете добавить переменную в модель ячейки recycleview, которая будет удерживать выбранный радиоиндекс. всякий раз, когда вы измените индекс, обновите эту переменную для подходящей модели. Затем, привязывая ячейку, вы можете установить выбранную радиокнопку на основе этой переменной – Bhushan

ответ

0

Глядя на ваш код и комментарии, которые я думаю, вы знаете, как работает RecyclerView особенно повторно использовать представления .. Единственное, что вы пропустили в режиме настройки просмотра на все сценарии, что я имею в виду, - вам всегда нужно писать else часть кода

class MyViewHolder extends RecyclerView.ViewHolder { 
      RadioGroup vRadioGroup; 

      public MyViewHolder(View itemView) { 
       super(itemView); 
       vRadioGroup = (RadioGroup) itemView.findViewById(R.id.group1); 
       //your other stuff 
       vRadioGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() { 
        @Override 
        public void onCheckedChanged(RadioGroup radioGroup, int i) { 
         int clickedPos= (int) radioGroup.getTag(); 
         messageArrayList.get(clickedPos).setSelectedRadioButtonId(radioButtonID); 
        } 
       }); 
      } 
} 

     @Override 
     public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { 

       Message message = messageArrayList.get(position); 

       //your other stuff 
       holder.vRadioGroup.setTag(position); 
       if (message.getSelectedRadioButtonId()!= -1){ 
        holder.vRadioGroup.check(message.getSelectedRadioButtonId()); 
       }else{ 
        //your always need to write else condition 
        holder.vRadioGroup.clearCheck(); 
       } 

     } 

надеюсь, что это поможет.

happyCoding;

+0

no thats not working – latha

+0

ну, я проверил его работы отлично для меня. – Bharatesh

+0

set 'setOnCheckedChangeListener' в вашем классе держателя, где вы определяете свои взгляды. не внутри 'onBindViewHolder' метод – Bharatesh

Смежные вопросы