を作成していて、spinner
それに を追加しOnItemSelectedListener
ました。ただし、作成時に起動することに気付きました。今、それを無視/破棄する方法があるかどうか疑問に思っていました。
値を使用できることはわかっていboolean
ますが、それは少し「汚い」です。
を作成していて、spinner
それに を追加しOnItemSelectedListener
ました。ただし、作成時に起動することに気付きました。今、それを無視/破棄する方法があるかどうか疑問に思っていました。
値を使用できることはわかっていboolean
ますが、それは少し「汚い」です。
これが私の解決策です。
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);
}
}
});
}
への呼び出しを阻止しようとしないでくださいOnItemSelectedListener
。
デフォルトでは、Android Spinner は Adapter から返された最初のアイテムを選択するため、OnItemSelectedListener
が呼び出されてそのアイテムに対する何らかのアクションがトリガーされます。
Spinner Adapter の最初のアイテムは空白のアイテムにすることをお勧めします。ID にOnItemSelectedListener
基づいてその空白のアイテムを無視できます。
これはあなたを助けるかもしれません。
@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
}
}
まあ、私は私にとって良い解決策を見つけたと思います、私は最初からそれを念頭に置いていましたが... 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);
}
};
}
};
}
他の誰かがこの質問に出くわした場合は、関連する質問 私が少し前に尋ねた を見てみる価値があるかもしれません.