1

雑学クイズアプリケーションに取り組んでおり、質問ごとに4つのラジオボタンが付いたリストビューに質問を表示しています。これが私のXMLコードです

    <LinearLayout 
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical"        
    android:id="@+id/radioButtonLayout">
<RadioGroup
android:id="@+id/radioGroup"
android:layout_width="wrap_content"
android:layout_height="wrap_content" 
 android:visibility="gone">

<RadioButton
    android:id="@+id/radioID_1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:focusable="false"
    android:saveEnabled="true"
    android:focusableInTouchMode="false"
    android:textColor="#000000" />

<RadioButton
    android:id="@+id/radioID_2"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:focusable="false"
    android:saveEnabled="true"
    android:focusableInTouchMode="false"
    android:textColor="#000000" />

<RadioButton
    android:id="@+id/radioID_3"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:focusable="false"
    android:saveEnabled="true"
    android:focusableInTouchMode="false"
    android:textColor="#000000" />

<RadioButton
    android:id="@+id/radioID_4"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:focusable="false"
    android:saveEnabled="true"
    android:focusableInTouchMode="false"
    android:textColor="#000000" />
</RadioGroup>    
</LinearLayout>

これが、ラジオボタンの選択を実装する方法です。getViewメソッドはここにあります。

@Override
    public int getCount() {
        // TODO Auto-generated method stub
        return mObjects.size();
    }


    public View getView(final int position, View view, ViewGroup parent) {
        LayoutInflater inflater = (LayoutInflater) mContext
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        if (view == null) {
            view = inflater.inflate(R.layout.question_option, parent, false);
            holder = new ViewHolder();
            holder.label = (TextView) view.findViewById(R.id.textView1);
            holder.radioButtonLayout = (RadioGroup) view.findViewById(R.id.radioGroup);

            holder.radioButtonFirst = (RadioButton) view.findViewById(R.id.radioID_1);
            holder.radioButtonSecond = (RadioButton) view.findViewById(R.id.radioID_2);
            holder.radioButtonThird = (RadioButton) view.findViewById(R.id.radioID_3);
            holder.radioButtonFourth = (RadioButton) view.findViewById(R.id.radioID_4);

            view.setTag(holder);
        } else {
            holder = (ViewHolder) view.getTag();
        }   
        holder.radioButtonFirst.setOnCheckedChangeListener(null);
            holder.radioButtonSecond.setOnCheckedChangeListener(null);
            holder.radioButtonThird.setOnCheckedChangeListener(null);
            holder.radioButtonFourth.setOnCheckedChangeListener(null);

                holder.radioButtonLayout.setVisibility(View.VISIBLE);
                holder.checkboxLayout.setVisibility(View.GONE);
                holder.radioButtonFirst.setChecked(firstItemChecked[position]);
                holder.radioButtonSecond.setChecked(secondItemChecked[position]);
                holder.radioButtonThird.setChecked(thirdItemChecked[position]);
                holder.radioButtonFourth.setChecked(fourthItemChecked[position]);
                holder.radioButtonFirst.setOnCheckedChangeListener(new OnCheckedChangeListener() {

                    @Override
                    public void onCheckedChanged(
                            CompoundButton buttonView, boolean isChecked) {
                        if (isChecked) {
                                firstItemChecked[position] = true;

                            } else {
                                firstItemChecked[position] = false;

                            }                               
                        }
                    });
            holder.radioButtonSecond.setOnCheckedChangeListener(new OnCheckedChangeListener() {

                @Override
                public void onCheckedChanged(
                        CompoundButton buttonView, boolean isChecked) {
                    if (isChecked) {
                        secondItemChecked[position] = true;

                    } else {
                        secondItemChecked[position] = false;
                    }
                }
            });
            holder.radioButtonThird.setOnCheckedChangeListener(new OnCheckedChangeListener() {

                @Override
                public void onCheckedChanged(
                        CompoundButton buttonView, boolean isChecked) {
                    if (isChecked) {
                                thirdItemChecked[position] = true;

                            } else {
                                thirdItemChecked[position] = false;

                            }

                        }
                    });
            holder.radioButtonFourth.setOnCheckedChangeListener(new OnCheckedChangeListener() {

                @Override
                public void onCheckedChanged(
                        CompoundButton buttonView, boolean isChecked) {
                    if (isChecked) {
                                fourthItemChecked[position] = true;

                            } else {
                                fourthItemChecked[position] = false;

                            }

                        }
                    });
        return view;
    }
  • 現在、5つの質問があり、getCountメソッドのmObjects.size()が5であるアプリケーション。getviewメソッドが5回以上呼び出されている場合でも。なぜそうなのか?

  • 最初のラジオボタンを選択した後、リストビューを上下にスクロールし、最初の質問(回答のために最初のラジオボタンを選択した質問)を表示するために上にスクロールすると、フォーカスが失われ、チェックされていないものとして表示されます。そしてもう一度、最初のオプションをチェックしようとしましたが、最初のラジオボタンを選択できませんでした。2番目のラジオボタンをクリックして2番目のオプションに移動して試してみると、最初のオプションは正常に機能しています。

デバッグ中、imは常にfirstItemchecked(0)(最初の質問の最初のオプション)をtrueとして取得しますが、選択されていない場合でも同様です。

この問題に4日以上苦労しています。友達を助けてください。どうもありがとう。

4

1 に答える 1

0

まず、コードを読みやすくしてください。たとえば、すべてのリスナーを次のように置き換えました。

holder.radioButtonFirst.setOnCheckedChangeListener(new CheckChange(position));
holder.radioButtonSecond.setOnCheckedChangeListener(new CheckChange(position));
holder.radioButtonThird.setOnCheckedChangeListener(new CheckChange(position));
holder.radioButtonFourth.setOnCheckedChangeListener(new CheckChange(position));
...
}
private class CheckChange implements OnCheckedChangeListener {
    private int position;
    private CheckChange(int position) {
        this.position = position;
    }
    @Override
    public void onCheckedChanged(CompoundButton button, boolean isChecked) {
        switch (button.getId()) {
        case R.id.radioID_1:
            firstItemChecked[position] = isChecked;
            break;
        case R.id.radioID_2:
            secondItemChecked[position] = isChecked;
            break;
        case R.id.radioID_3:
            thirdItemChecked[position] = isChecked;
            break;
        case R.id.radioID_4:
            fourthItemChecked[position] = isChecked;
            break;
        default:
            break;
        }
    }
}

第二に、firstItemChecked[0] が true でないことを確認しますか? どうやって初期化するの?RadioButtons で setOnChangeListener を使用しても問題が発生しました。代わりに onClickListeners を使用して解決しました。

于 2012-08-10T08:09:13.203 に答える