web-dev-qa-db-ja.com

Android:スピナーに影響を与えないsetSelection

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="" />

ヘルプは大歓迎です!

ライナス

47
aspartame

setSelection()への呼び出しの後に、setAdapter()への呼び出しを移動してみてください。

113
CommonsWare

同様の問題がありました。私の場合、setAdapersetSelectionは正しい順序でした!実行されたフォームonCreateは機能しましたが、onResumeから実行されたときは効果がありませんでした。

solutionsetSelection(my_pos, true)を呼び出すことです。 2番目のパラメーターに注意してください。

66
Greg Dan

あなたが試すかもしれません

mSpinner.post(new Runnable() {        
    public void run() {
      mSpinner.setSelection(1);
    }
  });

これにより、ビューが作成されるとすぐに実行される実行可能なアクションがポストされます

33
user2532906

私の場合、答えはどれも機能しなかったため、ハンドラーを介してsetSelectionをキューに入れました

new Handler().postDelayed(new Runnable() {        
    public void run() {
      mSpinner.setSelection(1);
    }
  }, 100);

これを行うと、低速のデバイスで実行しているときに問題が発生する可能性がありますが、特定のデバイスで作業しているため、このハックを使用しても問題ありません

25
Maragues

これを使って

    sp2.setAdapter(sp2.getAdapter());
    sp2.getAdapter().notifyDataSetChanged();
    sp2.setSelection(0, false);
1
Ali Bagheri

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();
1
saksham

解決策は、setSelection(my_pos、true)を呼び出すことです。 2番目のパラメーターに注意してください。

アニメートを呼び出す場合は、忘れずにレイアウトパラメータを設定してください:)例:

LinearLayout.LayoutParams spinnerLp = (LinearLayout.LayoutParams) spinner.getLayoutParams();
spinner.setSelection(selectedPositionAge, true);
spinnerLp.gravity = Gravity.CENTER;
spinner.setLayoutParams(spinnerLp);

スピナーに手動で設定されたパディングは手動でリセットする必要があります

1

アクティビティの最初の開始時にonCreate中にfragment : setSelection内のスピナーが正常に動作するのと同じ問題がありましたが、画面を回転させたときではありません。 setSelectionメソッド内で呼び出すのではなく、フラグメントのonViewStateRestoredメソッド内でonCreateを呼び出すことで解決しました。よくわかりませんが、setSelectionができても、ビューが完全にロードされるまでfindViewByIdを使用できないと思います。

1
piiiiipppp

以前の答えはどれも私にとってはうまくいきませんでした。ただし、機能したのは、フラグメントのonCreateView()メソッド(またはアクティビティのonCreate()メソッド)でインスタンス変数mSpinnerを作成してから、これを実行することでした。 onLoadFinished()メソッドで...

@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) {
    adapter.swapCursor(cursor);
    //mSpinner.setAdapter(adapter);
    mSpinner.setSelection(mSelectedIndex);
}
1

これを試して、それは私のために働いた:

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);
0
skandhan

場合によっては、スピナーが特定の値に設定され、要件に従って無効にされるため、リスナーを設定しない場合があります。

これは、リスナーを必要とするため、値を選択しない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);
0
koushick