53

スピナーの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="" />

ヘルプは大歓迎です!

ライナス

4

11 に答える 11

136

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

于 2009-09-27T21:35:09.100 に答える
74

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

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

于 2011-07-23T13:55:47.317 に答える
37

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

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

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

于 2013-06-28T18:02:22.927 に答える
29

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

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

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

于 2012-08-23T21:20:05.137 に答える
4

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

@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) {
    adapter.swapCursor(cursor);
    //mSpinner.setAdapter(adapter);
    mSpinner.setSelection(mSelectedIndex);
}
于 2015-08-02T18:03:11.823 に答える
3

Spinner.setSelection()以前に電話した場合は機能しませんSpinner.setAdapter()

setSelection()setAdapter()を呼び出した後に呼び出してみてください。

この背後にある理由:アダプターを設定する前に呼び出す場合Spinner.Selection()は、データが含まれていない場合、またはスピナーの最大アイテムが0である場合に、setSelection()によってスピナーをカスタムインデックスに設定しようとしていることを意味します。

setSelection(1)つまり、最大アイテムが=0のスピナーのインデックスを1に設定することを意味します。スピナー自体がこのoutofBoundIndexを処理するため、アプリがクラッシュすることはありません。

の呼び出しSetSelection()は、setAdapter()の後にのみ行う必要があります

また、があり、アクティビティがロードされたときに位置value = 0でティギングされるSpinner.SetOnItemSelectedListener()問題がある場合は、このパターンを使用する必要があります。onItemSelected(AdapterView<?> parent, View view, int position, long id)

Spinner.SetAdapter()
Spinner.setSelection();
Spinner.setOnItemSelectedListener();
于 2017-06-23T07:18:32.627 に答える
1

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

animateを呼び出す場合は、レイアウトパラメータを設定することを忘れないでください:)例:

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

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

于 2013-01-09T12:00:23.493 に答える
1

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

于 2013-06-28T16:35:26.277 に答える
1

これを使って

    sp2.setAdapter(sp2.getAdapter());
    sp2.getAdapter().notifyDataSetChanged();
    sp2.setSelection(0, false);
于 2018-03-05T01:44:14.650 に答える
0

これを試してみてください、それは私のために働きました:

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);
于 2016-01-17T17:55:09.477 に答える
0

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

これにより、リスナーが必要になるため、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);
于 2018-07-25T04:21:51.870 に答える