アンドロイド:スピナーに影響を与えないsetSelection
質問
私は、スピナー上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-一部を除いて意図したとおりにコードが動作する、と私は理由を理解することはできません。
スピナーの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
から実行された場合には効果がなかったです。
解決するはsetSelection(my_pos, true)
を呼び出すことです。二番目のパラメータに注目してください。
あなたは試してみてください。
mSpinner.post(new Runnable() {
public void run() {
mSpinner.setSelection(1);
}
});
これは、すぐにビューが作成されるように実行するために実行可能なアクションを掲載します。
私の場合の答えのどれも働いていないので、私は
ハンドラを介してsetSelectionをキューに入れられましたnew Handler().postDelayed(new Runnable() {
public void run() {
mSpinner.setSelection(1);
}
}, 100);
遅いデバイス上で動作しているとき、これは問題を引き起こす可能性が行うが、それはこのハックを使用しても大丈夫ですので、私は、特定のデバイスのために働いている。
ソリューションは、setSelection(my_pos、true)を呼び出すことです。二番目のパラメータに注目してください。
ドンの `tはあなたがアニメーションを呼び出した場合、セットアップのレイアウトは、paramsは、忘れてしまった:) 例:
LinearLayout.LayoutParams spinnerLp = (LinearLayout.LayoutParams) spinner.getLayoutParams();
spinner.setSelection(selectedPositionAge, true);
spinnerLp.gravity = Gravity.CENTER;
spinner.setLayoutParams(spinnerLp);
スピナーに手動settedパディングを手動resetedする必要がある
私はfragment : setSelection
内部スピナーと同じ問題は、活動の最初の開始時にonCreate
中に正しく動作しますが、いませんでした。私は、フラグメントのsetSelection
メソッド内onViewStateRestored
を呼び出す代わりにonCreate
メソッド内にそれを呼び出すことによってそれを解決しました。私はわからないが、私は、ビューが完全にロードされるまで、あなたはそれをsetSelection
ことができた場合でも、findViewById
を使用することはできませんと思います。
あなたがSpinner.setSelection()
前にそれを呼び出す場合Spinner.setAdapter()
は動作しません。
setAdapter()を呼び出した後setSelection()
を呼び出してみます。
の後ろのこの理由の:それは単にあなたはそれがどのデータか、我々が含まれていない場合にsetSelection()でカスタムインデックスにスピナーを設定しようとしていることを意味しますが、アダプタを設定する前にSpinner.Selection()
を呼び出すときザッツスピナーは最大項目= 0を持っていると言うことができます。
そうsetSelection(1)
手段。スピナー自体はこのoutofBoundIndexを扱いますが、あなたのアプリがありませんので、ないクラッシュします。
)(setAdapterた後でなければなりませんSetSelection()
するために呼び出すだけ
また、あなたはSpinner.SetOnItemSelectedListener()
を持っていて、onItemSelected(AdapterView<?> parent, View view, int position, long id)
位置値= 0活動の負荷でtiggeredするという問題があり、その後、あなたは、このパターンを使用する必要があります。
Spinner.SetAdapter()
Spinner.setSelection();
Spinner.setOnItemSelectedListener();
この
を使用します sp2.setAdapter(sp2.getAdapter());
sp2.getAdapter().notifyDataSetChanged();
sp2.setSelection(0, false);
私のために働いた前の回答のなし。仕事をやった、しかし、私のフラグメントのmSpinner
方法でインスタンス変数onCreateView()
を作成(またはあなたの活動のonCreate()
方法で)、それから...私の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につながることができます。
スピナーの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);