1

私はSectioned ListView自分のアプリケーションで i have の行でをListView使用しているため 、通常はラジオ ボタンをクリックすると、クリックされて正常に動作します。しかし、ビューをクリックしてスクロールすると、選択したビューも消えてチェックが外れます。TextViewRadioGroup.

これは私が使用しているXMLです

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/relativelay"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:background="@drawable/list_bg" >

    <TextView
        android:id="@+id/tvname"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_centerVertical="true"
        android:maxLines="1"
        android:padding="10dp"
        android:textColor="#000000"
        android:textSize="18dp"
        android:textStyle="bold" />

    <RadioGroup
        android:id="@+id/radioGroup1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"
        android:orientation="horizontal" >

        <RadioButton
            android:id="@+id/check_present"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentRight="true"
            android:layout_marginRight="20dp"
            android:onClick="onPresentClick" />

        <RadioButton
            android:id="@+id/check_absent"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_toLeftOf="@id/check_present"
            android:onClick="onPresentClick" />
    </RadioGroup>

</RelativeLayout>

そして、これは私が使用しているアダプターSectioned ListViewです....

これは私の更新されたコードです....

public class NamesAdapter extends ArrayAdapter<Item> {

    private ArrayList<Item> items;
    private LayoutInflater vi;
    private Item objItem;
    private ArrayList<Items> presentSelected = new ArrayList<Items>();;
    private ArrayList<Items> absentSelected = new ArrayList<Items>();;
    private Map<Integer, Boolean> map = new HashMap<Integer, Boolean>();
    ViewHolderSectionName holderSection;
    ViewHolderName holderName;
    Items item;

    public NamesAdapter(Context context, ArrayList<Item> items) {
        super(context, 0, items);

        this.items = items;

        vi = (LayoutInflater) context
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }

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

        objItem = items.get(position);

        if (objItem.isSectionItem()) {
            ItemsSections si = (ItemsSections) objItem;

            if (convertView == null
                    || !convertView.getTag().equals(holderSection)) {
                convertView = vi.inflate(R.layout.alphabet_separator, null);

                holderSection = new ViewHolderSectionName();
                convertView.setTag(holderSection);
            } else {
                holderSection = (ViewHolderSectionName) convertView.getTag();
            }

            holderSection.section = (TextView) convertView
                    .findViewById(R.id.alphabet_letter);

            holderSection.section
                    .setText(String.valueOf(si.getSectionLetter()));

        } else {
            Items ei = (Items) objItem;

            if (convertView == null || !convertView.getTag().equals(holderName)) {
                convertView = vi.inflate(R.layout.row, null);

                holderName = new ViewHolderName();

                holderName.name = (TextView) convertView
                        .findViewById(R.id.tvname);

                holderName.radioGroup = (RadioGroup) convertView
                        .findViewById(R.id.radioGroup1);
                holderName.checkAbsent = (RadioButton) convertView
                        .findViewById(R.id.check_absent);
                holderName.checkPresent = (RadioButton) convertView
                        .findViewById(R.id.check_present);

                Boolean present = map.get(position);

                Log.e("Names Adapter", "is Selected " + present);

                if (present != null && present.booleanValue()) {
                    // set present checkbox selected
                    holderName.checkPresent.setSelected(true);
                } else {
                    holderName.checkAbsent.setSelected(true);
                    // set absent checkbox selected
                }

                holderName.radioGroup
                        .setOnCheckedChangeListener(new OnCheckedChangeListener() {

                            @Override
                            public void onCheckedChanged(RadioGroup group,
                                    int checkedId) {
                                // TODO Auto-generated method stub
                                switch (checkedId) {
                                case R.id.check_absent:
                                    item = (Items) holderName.checkAbsent
                                            .getTag();
                                    absentSelected.add(item);
                                    map.put(position, true);
                                    break;

                                case R.id.check_present:
                                    item = (Items) holderName.checkPresent
                                            .getTag();
                                    presentSelected.add(item);
                                    map.put(position, true);
                                    break;

                                default:
                                    break;
                                }
                            }
                        });

                /*
                 * holderName.checkAbsent .setOnCheckedChangeListener(new
                 * CompoundButton.OnCheckedChangeListener() {
                 * 
                 * @Override public void onCheckedChanged( CompoundButton
                 * buttonView, boolean isChecked) { // TODO Auto-generated
                 * method stub holderName.checkAbsent.setSelected(isChecked); //
                 * selected1.add();
                 * 
                 * } });
                 * 
                 * holderName.checkPresent .setOnCheckedChangeListener(new
                 * CompoundButton.OnCheckedChangeListener() {
                 * 
                 * @Override public void onCheckedChanged( CompoundButton
                 * buttonView, boolean isChecked) { // TODO Auto-generated
                 * method stub holderName.checkAbsent.setSelected(isChecked); //
                 * selected2.add();
                 * 
                 * } });
                 */
                convertView.setTag(holderName);

            } else {
                holderName = (ViewHolderName) convertView.getTag();
            }

            if (holderName.name != null)
                holderName.name.setText(ei.getName());
            convertView.setOnCreateContextMenuListener(null);
        }
        return convertView;
    }

    public static class ViewHolderName {
        public TextView name;
        public RadioGroup radioGroup;
        public RadioButton checkPresent;
        public RadioButton checkAbsent;
    }

    public static class ViewHolderSectionName {
        public TextView section;
    }

}
4

1 に答える 1

3

リストビューを上下にスクロールすると、すべてのリストアイテム/ビューがリストアダプターによって再作成されるため、「チェック済み」ラジオボタンの状態を維持/保持して、上下にスクロールするときにチェックを維持する必要があります。

ラジオボタンにリスナーを設定して、チェックしたラジオボタンの位置/インデックスを保持する必要があります。

hashMap を使用して、list-item を s KEY として保持し、'Checked' ステータスを値として保持できます。ユーザーがボックスにチェックマークを付けると、マップにキー値が追加され、ユーザーがボックスのチェックを外すと、マップからキーが削除されます。

このマップをレンダリング リスト ビューで使用します。コードは次のとおりです。

private Map<Integer, Boolean> map =  new HashMap<Integer, Boolean>();    

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

     Boolean present = map.get(position);
     if(present != null && present.booleanValue()){
       // set present checkbox selected
     } else {
       // set absent checkbox selected
     }

    holderName.radioGroup.setOnCheckedChangeListener(new OnCheckedChangeListener() {
       public void onCheckedChanged(RadioGroup group, int checkedId) {
               switch (checkedId) {
                   case R.id.check_absent:
                        map.put(position, false)
                        break;
                   case R.id.check_present:
                        map.put(position, true)
                        break;
               }
      }
   });
}
于 2013-03-05T12:53:03.823 に答える