1

各行にラジオグループを持つカスタム ListView があります。チェック済みのラジオ ボタンを変更すると、いくつかの 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>

ダイアログ実装

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ます。ソフトキーボードが開くと、の表示領域が小さくなります。これにより、はListView不要な(技術的には表示されなくなった)アイテムビューを削除します。ソフトキーボードを非表示にすると、ListView領域が再び大きくなり、アイテムビューが欠落する原因になります。残念ながら、ラジオグループの最後に選択されたアイテムを保存および復元しないため、作成後、新しく表示されるアイテムには、ラジオグループで選択されたデフォルトのアイテムがあります。

于 2013-02-12T18:19:33.137 に答える