SpinnerでsetSelectionに問題があります。コードにスピナーが表示されるときに値を事前に選択するように設定しますが、効果はなく、リストの最初の代替が常に選択されます。コードは次のようになります。
LayoutInflater li = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
final View dialogView = li.inflate(R.layout.edit_event, null);
...
ArrayList<String> routes = new ArrayList<String>();
// routes filled with values at runtime
...
ArrayAdapter<String> aa = new ArrayAdapter<String>(GOFdroid.this, Android.R.layout.simple_spinner_item, routes);
aa.setDropDownViewResource(Android.R.layout.simple_spinner_dropdown_item);
Spinner destSpinner = (Spinner) dialogView.findViewById(R.id.edit_event_destination);
String dest = events.get(pos).getDestination();
int routesPos = routes.indexOf(dest);
Log.d(TAG, "Dest: " + dest + ", pos: " + routesPos);
destSpinner.setSelection(routesPos);
destSpinner.setAdapter(aa);
このコードは、setSelection-partを除き、意図したとおりに機能します。その理由はわかりません。
スピナーのXMLレイアウトは次のようになります(レイアウト全体ではなく、スピナー部分のみ)。
// DESTINATION
<TextView
Android:layout_width="fill_parent"
Android:layout_height="wrap_content"
Android:text="Destination:" />
<Spinner
Android:id="@+id/edit_event_destination"
Android:layout_width="fill_parent"
Android:layout_height="wrap_content"
Android:Prompt="@string/choose_dest"
Android:layout_marginBottom="10dip"
Android:text="" />
ヘルプは大歓迎です!
ライナス
setSelection()
への呼び出しの後に、setAdapter()
への呼び出しを移動してみてください。
同様の問題がありました。私の場合、setAdaper
とsetSelection
は正しい順序でした!実行されたフォームonCreate
は機能しましたが、onResume
から実行されたときは効果がありませんでした。
solution はsetSelection(my_pos, true)
を呼び出すことです。 2番目のパラメーターに注意してください。
あなたが試すかもしれません
mSpinner.post(new Runnable() {
public void run() {
mSpinner.setSelection(1);
}
});
これにより、ビューが作成されるとすぐに実行される実行可能なアクションがポストされます
私の場合、答えはどれも機能しなかったため、ハンドラーを介してsetSelectionをキューに入れました
new Handler().postDelayed(new Runnable() {
public void run() {
mSpinner.setSelection(1);
}
}, 100);
これを行うと、低速のデバイスで実行しているときに問題が発生する可能性がありますが、特定のデバイスで作業しているため、このハックを使用しても問題ありません
これを使って
sp2.setAdapter(sp2.getAdapter());
sp2.getAdapter().notifyDataSetChanged();
sp2.setSelection(0, false);
Spinner.setSelection()
は、Spinner.setAdapter()
の前に呼び出すと機能しません。
SetAdapter()の呼び出し後にsetSelection()
を呼び出してみてください。
理由:アダプタを設定する前にSpinner.Selection()
を呼び出すと、単にsetSelection()が含まれていないときにスピナーをカスタムインデックスに設定しようとしていることを意味します。データまたはスピナーの最大アイテム= 0であると言うことができます。
setSelection(1)
は、最大アイテム= 0のスピナーのインデックスを1に設定することを意味します。スピナー自体がこのoutofBoundIndexを処理するため、アプリはクラッシュしません。
SetSelection()
への呼び出しはsetAdapter()の後にのみ行う必要があります
また、Spinner.SetOnItemSelectedListener()
があり、アクティビティのロード時にonItemSelected(AdapterView<?> parent, View view, int position, long id)
が位置値= 0でトリガーされるという問題がある場合、このパターンを使用する必要があります。
Spinner.SetAdapter()
Spinner.setSelection();
Spinner.setOnItemSelectedListener();
解決策は、setSelection(my_pos、true)を呼び出すことです。 2番目のパラメーターに注意してください。
アニメートを呼び出す場合は、忘れずにレイアウトパラメータを設定してください:)例:
LinearLayout.LayoutParams spinnerLp = (LinearLayout.LayoutParams) spinner.getLayoutParams();
spinner.setSelection(selectedPositionAge, true);
spinnerLp.gravity = Gravity.CENTER;
spinner.setLayoutParams(spinnerLp);
スピナーに手動で設定されたパディングは手動でリセットする必要があります
アクティビティの最初の開始時にonCreate
中にfragment : setSelection
内のスピナーが正常に動作するのと同じ問題がありましたが、画面を回転させたときではありません。 setSelection
メソッド内で呼び出すのではなく、フラグメントのonViewStateRestored
メソッド内でonCreate
を呼び出すことで解決しました。よくわかりませんが、setSelection
ができても、ビューが完全にロードされるまでfindViewById
を使用できないと思います。
以前の答えはどれも私にとってはうまくいきませんでした。ただし、機能したのは、フラグメントのonCreateView()
メソッド(またはアクティビティのonCreate()
メソッド)でインスタンス変数mSpinner
を作成してから、これを実行することでした。 onLoadFinished()
メソッドで...
@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) {
adapter.swapCursor(cursor);
//mSpinner.setAdapter(adapter);
mSpinner.setSelection(mSelectedIndex);
}
これを試して、それは私のために働いた:
Spinner destSpinner = (Spinner)dialogView.findViewById(R.id.edit_event_destination);
destSpinner.setSelection(0);
String dest = events.get(pos).getDestination();
int routesPos = routes.indexOf(dest);
destSpinner.setAdapter(aa);
Log.d(TAG, "Dest: " + dest + ", pos: " + routesPos);
destSpinner.setSelection(routesPos);
場合によっては、スピナーが特定の値に設定され、要件に従って無効にされるため、リスナーを設定しない場合があります。
これは、リスナーを必要とするため、値を選択しないsetSelection()につながる可能性があります。
SpinnerのsetOnItemSelectedListener()が以下のようなカスタムリスナーに設定されていることを確認してください。
スピナーが無効になっている場合でも、setSelection()メソッドが機能するように、以下のようなリスナーを設定する必要があります。
spinnerListener.setOnItemSelectedListener(spinnerListener);
AdapterView.OnItemSelectedListener spinnerListener = new
AdapterView.OnItemSelectedListener()
{
@Override
public void onItemSelected(AdapterView<?> adapterView, View view, int position, long l) {
//Your code
}
}
spinnerListener.setSelection(0);