7

Androidのスピナーに問題があります。ドロップダウンからアイテムを選択すると、次に開いたときにそのドロップダウンのオフセットが調整されます。たとえば、500アイテムのドロップダウンでアイテム100を選択した場合、次にドロップダウンを開くと、アイテム100がリストの一番上に表示されます。これが私が望む行動です。

セレクター機能との呼び出しを組み合わせると問題が発生するようsetSelection(int)です。次の手順で、ドロップダウンスピナーのオフセットシステムが壊れたようです。

  • スピナーを開き、2番目のアイテムを選択します。
  • スピナーをもう一度開き、今度は何も選択せずにスピナーを閉じます。
  • setSelection(int)2より大きい値でスピナーを呼び出します。
  • スピナーを3回開きます。オフセットはステップ1に戻ったときと同じであることに注意してください。

SpinnerとAdapterViewのコードを確認しましたが、見逃したパブリックコールは表示されません。これはSpinnerのバグですか、それとも私のコードのバグですか?

4

2 に答える 2

2

試しましたpublic void setSelection (int position, boolean animate)か?私は試していませんがtrue、2番目のパラメーターとして渡すと、リストが選択した位置にスクロールするはずです。もう 1 つの方法は、スクロール オフセット (アイテムの高さ x 選択したアイテムの位置) を計算して を呼び出すことsetDropDownVerticalOffsetです。

更新: API デモの Spinner の例を使用するように変更してsetSelection(7, true)みましたが、質問で提供した 4 つの手順に従うとうまくいくようです。Handler を追加して、showToast次のように変更しました。

private final Handler handler = new Handler();

void showToast(CharSequence msg) {
    Toast.makeText(this, msg, Toast.LENGTH_SHORT).show();
    handler.postDelayed(new Runnable(){
        public void run() {
            Toast.makeText(Spinner1.this, "auto setting", Toast.LENGTH_SHORT).show();
            Spinner s2 = (Spinner) findViewById(R.id.spinner2);
            s2.setSelection(7, true);
        }
    }, 5000);
}

私は次のようにテストしました:

  1. 2 番目のスピナーを開き、「Venus」を選択します (2 番目の選択)。
  2. 2 番目のスピナーを開き、押して閉じます
  3. 5 秒後、postDelayed 呼び出しにより「Neptune」(7 番目の選択) が選択されます。
  4. スピナーを開き、オフセットが正しい
于 2013-02-08T15:11:24.640 に答える
1

List を Adapter に送信することで、その問題を解決できると思います。アイテムが選択されたら、リストを並べ替えてから、アダプターの notifyDataSetChanged() 関数を使用します。setSelection(int) 関数を再度呼び出したときに、リストをソートし、notifyDataSetChanged() 関数を使用します。

于 2013-02-08T09:08:37.727 に答える