4

ドロップダウンビューの最初のアイテムにラジオボタンがないスピナーを作成しようとしています。スピナーに2つの異なるビューがあり、ビューが間違ったアイテムにリサイクルされないように、arrayadapterのビュータイプをオーバーライドします。次に、arrayadapterのgetDropDownViewをオーバーライドして、最初のアイテムからラジオボタンを削除します。これは機能していますが、選択したアイテムにラジオボタンが表示されません。常に存在するはずなので、setCheckMarkDrawable(android.R.drawable.btn_radio)を設定する必要はないと思いますが、そうではありません。何か案は?ありがとうございました!

        @Override
        public int getViewTypeCount()
        {
            return 2;
        }

        @Override
        public int getItemViewType(int position)
        {
            if (position == 0)
                return 0;
            else
                return 1;
        }

        @Override
        public View getDropDownView(int position, View convertView, android.view.ViewGroup parent)
        {
            if (position == 0)
            {
                View vw = super.getDropDownView(position, convertView, parent);
                CheckedTextView tv = (CheckedTextView) vw;
                if (tv != null)
                {
                    tv.setCheckMarkDrawable(null);
                    tv.setTextColor(Color.GRAY);
                    return tv;
                }
                return vw;
            } else
            { 
                View vw = super.getDropDownView(position, convertView, parent);
                CheckedTextView tv = (CheckedTextView) vw;
                if (tv != null)
                {
                    tv.setCheckMarkDrawable(android.R.drawable.btn_radio);
                    tv.setTextColor(Color.BLACK);
                    return tv;
                }
                return vw;
            }
        }
4

3 に答える 3

3

私も同じ問題を抱えてる。はい、pzagor2が言ったように、Spinner はドロップダウン リスト (getDropDownView) のマルチ レイアウト リサイクルをサポートしていません。getViewTypeCount と getItemViewType を呼び出さないだけです。ここに問題があります - #17128

ただし、現在のスピナー項目を表示し、スピナーの幅を検出するために使用される getView に対してこれらのメソッドを呼び出します。

回避策:提供された convertView の型が正しいかどうかを確認し、正しくない場合は使用しないでください。たとえば、2 つのタイプがあり、一方のタイプが他方よりも使用頻度が低い場合などに役立ちます。

于 2012-11-27T15:56:59.120 に答える
0

Spinner で ArrayAdapter を使用すると、getItemViewType と getViewTypeCount が呼び出されないと思います。1 つの解決策は、convertView をリサイクルせず、常に null であると想定することです。しかし、LogCat ではスピナーが遅くなり、多くの GC 呼び出しが発生します。

于 2012-06-28T17:49:52.980 に答える
0

ビューのリサイクルは Spinner では機能しないため、複数のビューがある場合は Spinner を使用しないでください。代わりに、Spinner としてスタイル設定された TextView を使用し、onClick でドロップダウンを表示するカスタム ダイアログを開きます。

<TextView android:id="@+id/labels_spinner"
      android:layout_width="fill_parent"
      android:layout_height="wrap_content"
      style="@style/Base.Widget.AppCompat.Spinner.Underlined"/>


@OnClick(R.id.labels_spinner)
public void onSpinnerClick(View view) {
    // Open dropdown dialog
}
于 2017-07-06T18:30:41.347 に答える