单选按钮在分段列表视图的滚动上更改状态

时间:2013-03-05 09:52:33

标签: android listview adapter

我在我的应用程序中使用Sectioned ListViewListView的行中我有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;
    }

}

1 个答案:

答案 0 :(得分: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;
               }
      }
   });
}