1

我有一个自定义 ListView,每行都有一个 radiogroup。当我更改选中的单选按钮时,我会调用一个带有一些编辑文本字段的对话框(使用 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>

对话实现

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>
4

1 回答 1

-1

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

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随着软键盘的打开,a 的可见区域会变小。这会导致ListView删除不必要的(技术上:不再可见)项目视图。当您隐藏软键盘时,该ListView区域再次变大,从而导致它创建丢失的项目视图。不幸的是,您没有保存和恢复单选组的最后一个选定项目,因此,在创建新可见项目后,在单选组中选择了默认项目。

于 2013-02-12T18:19:33.137 回答