键盘复位radiogroup值

时间:2013-02-12 16:19:27

标签: android listview keyboard radio-button radio-group

我有一个自定义ListView,每行都有一个radiogroup。 当我更改选中的单选按钮时,我调用一个带有一些edittext字段的对话框(使用onCheckedChanged()方法)。但是,当我专注于编辑文本来编写某些东西时,我丢失了键盘上覆盖的所有已检查的单选按钮,并且该组返回到所选的默认选项。 有人能帮助我吗?

列出适配器

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    View row = convertView;
    ContractItemHolder cih = new ContractItemHolder();
    if (row == null){
        LayoutInflater inflater = ((Activity)context).getLayoutInflater();
        row = inflater.inflate(R.layout.row_proposals_item, parent, false);
        cih.setTvItemTitle((TextView)row.findViewById(R.id.textViewItemTitle));
        cih.setRgItemStatus((RadioGroup)row.findViewById(R.id.radioGroupStatus));

        row.setTag(cih);
    }else {
        cih=(ContractItemHolder)row.getTag();
    }
    final ContractItem ci = list.get(position);
    cih.getRgItemStatus().setOnCheckedChangeListener(new OnCheckedChangeListener() {

        @Override
        public void onCheckedChanged(RadioGroup group, int checkedId) {
            groupSel = group;
            int selected = group.getCheckedRadioButtonId();
            Dialog d;
            switch (selected) {
            case R.id.radioAccepted:
                d = createDialog(context, ACCEPTED_CODE, ci, selected);
                d.show();
                break;
            case R.id.radioRefused:
                d = createDialog(context, REFUSED_CODE, ci, selected);
                d.show();
                break;
            default:
                break;
            }
        }
    });
    cih.getTvItemTitle().setText(ci.getDescItem());
    return row;
}

列出项目布局(行..)

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal"
    android:padding="5dp" 
    android:gravity="center">

    <TextView
        android:id="@+id/textViewItemTitle"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:text="Large Text"
        android:layout_weight="3"
        android:textAppearance="?android:attr/textAppearanceLarge"/> 

    <RadioGroup
        android:id="@+id/radioGroupStatus"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" 
        android:orientation="horizontal"
        android:layout_weight="1"
        android:showDividers="middle">

        <RadioButton
            android:id="@+id/radioNull"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Non Proposto" 
            android:checked="true"
            android:textAppearance="?android:attr/textAppearanceLarge"/>

        <RadioButton
            android:id="@+id/radioPending"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="In trattativa" 
            android:textAppearance="?android:attr/textAppearanceLarge"
            android:textColor="@color/Blue"/>

        <RadioButton
            android:id="@+id/radioAccepted"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Accettato" 
            android:textAppearance="?android:attr/textAppearanceLarge"
            android:textColor="@color/Green"/>

        <RadioButton
            android:id="@+id/radioRefused"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Rifiutato" 
            android:textAppearance="?android:attr/textAppearanceLarge"
            android:textColor="@color/Red"/>

    </RadioGroup> 

</LinearLayout>

Dialog impl

private Dialog createDialog(Context context, final int code, ContractItem item,final int selected){ //type: refused, accepted
    d = new Dialog(context);
    d.setTitle(item.getDescItem());
    d.setContentView(R.layout.layout_dialog_prop);
    d.getWindow().setLayout(900, LayoutParams.WRAP_CONTENT);
    d.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN);

    Button btnOK = (Button)d.findViewById(R.id.buttonPropOK);
    Button btnCancel = (Button)d.findViewById(R.id.buttonPropCancel);
    btnCancel.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            d.dismiss();
        }
    });
    btnOK.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            d.dismiss();

        }
    });
    return d;
}

对话框布局

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:gravity="center"
    android:orientation="vertical" >

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        android:padding="50dp" >

        <EditText
            android:id="@+id/editTextDiscount"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="30dp"
            android:ems="10"
            android:hint="Sconto proposto"
            android:inputType="number"
            android:textAppearance="?android:attr/textAppearanceLarge" >

            <requestFocus />
        </EditText>

        <Spinner
            android:id="@+id/spinnerScuse"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="30dp"
            android:textAppearance="?android:attr/textAppearanceLarge"
            android:visibility="gone" />

        <EditText
            android:id="@+id/editText1"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_marginTop="30dp"
            android:ems="10"
            android:gravity="top"
            android:hint="Note"
            android:inputType="textMultiLine"
            android:textAppearance="?android:attr/textAppearanceLarge" />
    </LinearLayout>

    <View
        android:id="@+id/view2"
        android:layout_width="match_parent"
        android:layout_height="2dp"
        android:layout_marginTop="30dp"
        android:background="@android:color/holo_blue_light" />

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content" >

        <Button
            android:id="@+id/buttonPropCancel"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:background="@android:color/transparent"
            android:text="Annulla"
            android:textColor="@android:color/holo_blue_light" />

        <View
            android:id="@+id/view1"
            android:layout_width="1dp"
            android:layout_height="match_parent"
            android:background="@android:color/holo_blue_light" />

        <Button
            android:id="@+id/buttonPropOK"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:background="@android:color/transparent"
            android:text="Ok"
            android:textColor="@android:color/holo_blue_light" />

    </LinearLayout>

</LinearLayout>

1 个答案:

答案 0 :(得分:0)

您部分了解列表项视图回收过程。

ListView组件不会为列表中的每个项生成视图。因此,在您的案例中不会有15个。屏幕上可以容纳多少。滚动列表时,旧的项目(不再可见)将被回收。然后使用getView调用convertView != null,并且适配器为您提供更新此回收项视图的机会。这样做是出于性能原因 - 想象一下具有10000个项目的适配器(在商业应用程序中并不罕见)。它应该创建所有10000个列表项视图吗?想象一下滚动这样一个列表时你会有的表现......

在您的getView()代码中,您只能部分更新项目视图 - 您始终在此行中设置项目标题:

cih.getTvItemTitle().setText(ci.getDescItem());

当创建新项目视图(即convertView == null)时,无线电组具有默认选择,在您的情况下可能没问题。

但是,当项目视图被回收时(即convertView != null),那么你:

  • 在此行中设置更改侦听器:

    cih.getRgItemStatus().setOnCheckedChangeListener(...);
    
  • 设置项目标题:

    cih.getTvItemTitle().setText(ci.getDescItem());
    

但是你永远不会设置被检查的无线电组项目。这意味着,它将具有最后为该项视图实例设置的值 - 不适用于该位置。您应该存储该信息 - 可能在ContractItem,在选择无线电组项目时更新它,最后 - 在convertView != null时检索它并将无线电组的选定项目设置为正确的值。

打开对话框时可能会看到此缺陷 - 当软键盘打开时,ListView的可见区域会变小。这会导致ListView删除不必要的(技术上:不再可见)项目视图。隐藏软键盘时,ListView区域会再次变大,从而导致其创建缺少的项目视图。遗憾的是,您不保存和恢复无线电组的最后一个选定项目,因此,在创建后,新显示的项目将在无线电组中选择默认项目。