2017-02-16 2 views
1

ListViewは2 TextView、ラジオグループにはRadioButtonsを使用しています。私がRadioButtonを選択したとき、そのラジオ・グループが見えなくなり、答えがTextViewになっていることがわかります。その完璧に動作しますが、問題は私が下にスクロールして再びラジオグループがスクロールアップするときです。スクロールすると、リストビューのラジオボタン自体がチェックされなくなります

class CustomAdapter extends ArrayAdapter<String> { 

    public CustomAdapter(Context context, int resource, int textViewResourceId, ArrayList<String> objects) { 
     super(context, resource, textViewResourceId, objects); 

    } 

    @Override 
    public View getView(final int position, View convertView, ViewGroup parent) { 

     LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     final View v = inflater.inflate(R.layout.row, parent, false); 
     TextView mcqsText = (TextView) v.findViewById(R.id.mcqsText); 
     final TextView ans2 = (TextView) v.findViewById(R.id.answer2); 
     final TextView anss = (TextView) v.findViewById(R.id.answer); 
     final RadioGroup rg = (RadioGroup) v.findViewById(R.id.radioGroup); 
     RadioButton opt1 = (RadioButton) v.findViewById(R.id.optA); 
     RadioButton opt2 = (RadioButton) v.findViewById(R.id.optB); 
     RadioButton opt3 = (RadioButton) v.findViewById(R.id.optC); 
     RadioButton opt4 = (RadioButton) v.findViewById(R.id.optD); 
     final ImageView ivcorrect= (ImageView) v.findViewById(R.id.ivcorrect); 
     final ImageView ivwrong= (ImageView) v.findViewById(R.id.ivwrong); 

     mcqsText.setText(mcqs.get(position)); 
     opt1.setText(optA.get(position)); 
     opt2.setText(optB.get(position)); 
     opt3.setText(optC.get(position)); 
     opt4.setText(optD.get(position)); 
     anss.setText(ans.get(position)); 
     ans2.setText("Correct answer is = "+ans.get(position)); 

     rg.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() { 
      @Override 
      public void onCheckedChanged(RadioGroup group, int checkedId) { 

       int radioButtonID = group.getCheckedRadioButtonId(); 
       View radioButton = group.findViewById(radioButtonID); 
       //find radiobutton position 
       int position = group.indexOfChild(radioButton); 
       RadioButton btn = (RadioButton) rg.getChildAt(position); 
       String selection = (String) btn.getText(); 

       if (selection.equals(anss.getText().toString())) { 
        rg.setVisibility(View.GONE); 
        ans2.setVisibility(View.VISIBLE); 
        ivcorrect.setVisibility(View.VISIBLE); 
        correct++; 
       } else { 
        ivwrong.setVisibility(View.VISIBLE); 
        ans2.setVisibility(View.VISIBLE); 
        wrong++; 
       } 

      } 
     }); 

     return v; 
    } 
} 
+0

です。 –

+0

配列を使用してチェック位置を管理するか、カスタムオブジェクト(POJO) –

答えて

1

ここでは、私の解決策は、あなたのアダプタデータとラジオボタンのチェックの付いている位置を保存する必要が

public class CurrentAffairs extends AppCompatActivity { 
public static int correct, wrong, marks; 
DbH db; 
ArrayList<Question> mcqs; 
Cursor cur; 
ListView lv; 
CustomAdapter c; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.current_affairs); 
    lv = (ListView) findViewById(R.id.lv); 
    mcqs = new ArrayList<>(); 

    try { 
     db = new DbH(this); 
    } catch (IOException e2) { 
     e2.printStackTrace(); 
    } 
    try { 
     db.createdatabase(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
    db.opendatabase(); 
    cur = db.data(); 
    try { 
     while (cur.moveToNext()) { 
      String mcqss = cur.getString(1); 
      String opta = cur.getString(2); 
      String optb = cur.getString(3); 
      String optc = cur.getString(4); 
      String optd = cur.getString(5); 
      String answ = cur.getString(6); 

      Question question = new Question(); 
      question.question = mcqss; 
      question.option1 = opta; 
      question.option2 = optb; 
      question.option3 = optc; 
      question.option4 = optd; 
      question.correctanxer = answ; 
      mcqs.add(question); 


      c = new CustomAdapter(CurrentAffairs.this, R.layout.row, R.id.mcqsText, mcqs); 
      lv.setAdapter(c); 
     } 
    } finally { 
     cur.close(); 
    } 
    Button btnshow = (Button) findViewById(R.id.btnshowresult); 
    btnshow.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      StringBuffer sb = new StringBuffer(); 
      sb.append("Correct Answer = " + " " + correct); 
      sb.append(" " + "Wrong Answer = " + " " + wrong); 
      sb.append(" " + "Final Score = " + " " + correct * 5); 

      Toast.makeText(CurrentAffairs.this, sb, Toast.LENGTH_SHORT).show(); 
     } 
    }); 
} 



class CustomAdapter extends ArrayAdapter<Question> { 

    public CustomAdapter(Context context, int resource, int textViewResourceId, ArrayList<Question> objects) { 
     super(context, resource, textViewResourceId, objects); 


    } 

    @Override 
    public View getView(final int position, View convertView, ViewGroup parent) { 

     LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     View v = inflater.inflate(R.layout.row, parent, false); 
     TextView mcqsText = (TextView) v.findViewById(R.id.mcqsText); 
     TextView ans2 = (TextView) v.findViewById(R.id.answer2); 
     TextView anss = (TextView) v.findViewById(R.id.answer); 
     RadioGroup rg = (RadioGroup) v.findViewById(R.id.radioGroup); 

     RadioButton opt1 = (RadioButton) v.findViewById(R.id.optA); 
     RadioButton opt2 = (RadioButton) v.findViewById(R.id.optB); 
     RadioButton opt3 = (RadioButton) v.findViewById(R.id.optC); 
     RadioButton opt4 = (RadioButton) v.findViewById(R.id.optD); 

     Question question = mcqs.get(position); 

     mcqsText.setText(question.question); 
     opt1.setText(question.option1); 
     opt2.setText(question.option2); 
     opt3.setText(question.option3); 
     opt4.setText(question.option4); 
     anss.setText(question.selectedanxer); 
     ans2.setText("Correct answer is = " + question.correctanxer); 

     String test=opt1.getText().toString(); 
     String test2=question.selectedanxer+""; 

     if (test.equals(""+test2)){ 
      opt1.setChecked(true); 
     } 
     if (test2.equals(opt2.getText()+"")){ 
      opt2.setChecked(true); 
     } 
     if (test2.equals(opt3.getText()+"")){ 
      opt3.setChecked(true); 
     } 
     if (test2.equals(opt4.getText()+"")){ 
      opt4.setChecked(true); 
     } 




     rg.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() { 
      @Override 
      public void onCheckedChanged(RadioGroup group, int checkedId) { 


       Question question1=mcqs.get(position); 
       RadioButton radioButton= (RadioButton) group.findViewById(checkedId); 
       mcqs.get(position).selectedanxer=radioButton.getText().toString(); 
       notifyDataSetChanged(); 



      } 
     }); 

     return v; 
    } 
} 

public class Question { 
    String question; 
    String option1; 
    String option2; 
    String option3; 
    String option4; 

    String selectedanxer; 
    String correctanxer; 

} 

} 
+0

[複数の質問に同じ回答]を追加しないでください(http://meta.stackexchange.com/questions/104227/is-it-acceptable-to-ad??da-duplicate-answer-to-several-質問)。あなたが十分な評判を得たら、最高のものに答え、残りを重複としてフラグを立てます。重複していない場合は、質問への投稿を調整します。 –

+0

はい。その作業は完璧です。ありがとう。 –

+0

@ManfredRadlwimmerがそれを手に入れました –

0

intは[]配列 'をチェックし'、getViewメソッドで

int[] checked; 


public CustomAdapter(Context context, int resource, int textViewResourceId, ArrayList<String> objects) { 
     super(context, resource, textViewResourceId, objects); 
     checked = new int[objects.size()]; 
     for(int curInt : checked) 
      curInt = -1; // -1 as a flag, that none is checked yet for this item. 
    } 

はあなたがそれぞれを選択されたチェック、onCheckedChangedリスナー内

switch(checked[position]){ 
    case 0: 
      //check your first radiobutton 
      opt1.setChecked(true); 
      rg.setVisibility(View.GONE); 
      break; 
    case 1: 
      //check your second radiobutton 
      opt2.setChecked(true); 
      rg.setVisibility(View.GONE); 
      break; 
    case 2: 
      //check your second radiobutton 
      opt3.setChecked(true); 
      rg.setVisibility(View.GONE); 
      break; 
    case 3: 
      //check your second radiobutton 
      opt4.setChecked(true); 
      rg.setVisibility(View.GONE); 
      break; 
    default: 
      break; 
} 

をMETHOD-あなたのクラスに追加します。チェックした配列を更新してください。

switch(checkedId){ 
    case R.id.optA: 
      checked[position] = 0; 
      break; 
    case R.id.optB: 
      checked[position] = 1;  
      break; 
    case R.id.optC: 
      checked[position] = 2; 
      break; 
    case R.id.optD: 
      checked[position] = 3; 
      break; 
} 

私はそれが役に立てば幸い:)

+0

を使用してselectの代わりに書込みスイッチを使用する必要があります。それはプロブラムを解決していません。 PLZヘルプ。 –

+0

あなたは正しいです、選択の代わりに、私の悪い。 私のコードを修正し、rgが消えるために必要なものを追加する。 –

+0

getView switch-selectにコードを追加したので、すでに応答された項目を呼び出すたびに.setVisibility(View.GONE)のradiogroupが呼び出されます。 –

関連する問題