14

を作成していて、spinnerそれに を追加しOnItemSelectedListenerました。ただし、作成時に起動することに気付きました。今、それを無視/破棄する方法があるかどうか疑問に思っていました。

値を使用できることはわかっていbooleanますが、それは少し「汚い」です。

4

5 に答える 5

2

これが私の解決策です。

Route Grade Spinner と Route Checkbox の間に依存関係があるため、最初の項目選択イベントを無視する必要があります。

そして、すべてのコントロールは、アクティビティへの以前の訪問に基づいて設定されています。

// Used to count the number of times the onItemSelected gets fired
private int mGradeSelectionCount = 0;

private void attachHandlers() {
    OnItemSelectedListener gradeRangeSelectionMadeListener;
    gradeRangeSelectionMadeListener = new OnItemSelectedListener() {
        @Override
        public void onItemSelected(AdapterView<?> adapter, View view, int position, long id) {
            // If the counter is 0 then we can assume that it is android firing the event
            if (mGradeSelectionCount++ < 1) {
                return;
            }
            if (mCmbGradeFrom.getSelectedItemPosition() == 0) {
                // Uncheck the Route checkbox
                mChkTypeRoute.setChecked(false);
            } else {
                // Check the Route checkbox
                mChkTypeRoute.setChecked(true);
            }
        }
        @Override
        public void onNothingSelected(AdapterView<?> arg0) {
            // Dont care, keep the same values as before

        }
    };
    mCmbGradeFrom.setOnItemSelectedListener(gradeRangeSelectionMadeListener);
    mChkTypeRoute.setOnCheckedChangeListener(new OnCheckedChangeListener() {
        @Override
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
            if (!isChecked) {
                mCmbGradeFrom.setSelection(0);
                mCmbGradeTo.setSelection(0);
            }
        }
    });
}
于 2013-01-08T11:29:45.223 に答える
1

への呼び出しを阻止しようとしないでくださいOnItemSelectedListener

デフォルトでは、Android Spinner は Adapter から返された最初のアイテムを選択するため、OnItemSelectedListenerが呼び出されてそのアイテムに対する何らかのアクションがトリガーされます。

Spinner Adapter の最初のアイテムは空白のアイテムにすることをお勧めします。ID にOnItemSelectedListener基づいてその空白のアイテムを無視できます。

于 2011-12-23T21:45:08.940 に答える
1

これはあなたを助けるかもしれません。

@Override  
public void onItemSelected( AdapterView<?> parent, View view, int position, long id)
{
    if(view!=null &&  view.getId()!=0){
        //do your code here to avoid callback twice 
    }
}
于 2013-09-27T15:57:12.297 に答える
0

まあ、私は私にとって良い解決策を見つけたと思います、私は最初からそれを念頭に置いていましたが... DoLater と呼ばれる Android Handler に基づくカスタムラッパークラスがあり、リスナーに基づくカスタムアダプタもあるため、貼り付けをコピーすることはできませんこれはしかし、あなたはアイデアを得るでしょう。危険なことは、どういうわけか遅延 500 が長くなりすぎて、ビューが既に破壊されている可能性があることです (ユーザーが有線の操作をすばやく実行したり、電話が遅くなったりした場合...)。しかし、このように OnItemSelectedListener は作成時に起動されません。

public void onResume() {
    super.onResume();
    new DoLater(this, 500) {
                public void run() {
                    new OnSpinnerSelectedAdapter(getBowSpinner()) {
                        protected void onItemSelected(int position) {
                            onBowSelected(position);
                        }
                    };
                }
            };
}
于 2014-02-17T10:13:26.820 に答える
0

他の誰かがこの質問に出くわした場合は、関連する質問 私が少し前に尋ねた を見てみる価値があるかもしれません.

于 2011-11-15T05:58:47.473 に答える