[英]Android: setSelection having no effect on Spinner
我在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="" />
非常感谢帮助!
莱纳斯
在调用setAdapter()
之后尝试将调用移动到setSelection()
setAdapter()
。
我有类似的问题。 在我的情况下, setAdaper
和setSelection
顺序正确! 已执行的表单onCreate
工作,但从onResume
执行时没有任何效果。
解决方案是调用setSelection(my_pos, true)
。 注意第二个参数。
你可以试试
mSpinner.post(new Runnable() {
public void run() {
mSpinner.setSelection(1);
}
});
这将在创建视图后立即发布runnable操作
在我的情况下,没有一个答案有效,所以我通过Handler将setSelection排队
new Handler().postDelayed(new Runnable() {
public void run() {
mSpinner.setSelection(1);
}
}, 100);
这样做可能会导致在慢速设备上运行时出现问题,但我正在为特定设备工作,因此可以使用此hack
解决方案是调用setSelection(my_pos,true)。 注意第二个参数。
不要忘记,如果你调用动画,然后设置布局参数:)示例:
LinearLayout.LayoutParams spinnerLp = (LinearLayout.LayoutParams) spinner.getLayoutParams();
spinner.setSelection(selectedPositionAge, true);
spinnerLp.gravity = Gravity.CENTER;
spinner.setLayoutParams(spinnerLp);
需要手动重置手动设置的填充到微调器
我在fragment : setSelection
使用了一个微调器时遇到了同样的问题fragment : setSelection
在第一次启动活动时在onCreate
期间正常工作,但在旋转屏幕时却没有。 我通过在片段的onViewStateRestored
方法中调用setSelection
而不是在onCreate
方法中调用它来解决它。 我不确定,但我认为在视图完全加载之前你不能使用setSelection
,即使你可以findViewById
它。
之前的答案都不适合我。 但是,在我的片段的onCreateView()
方法中(或在你的活动的onCreate()
方法中onCreate()
创建了实例变量mSpinner
,然后在我的onLoadFinished()
方法中执行此操作...
@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) {
adapter.swapCursor(cursor);
//mSpinner.setAdapter(adapter);
mSpinner.setSelection(mSelectedIndex);
}
Spinner.setSelection()
如果你之前调用它不工作Spinner.setAdapter()
尝试调用setAdapter()后调用setSelection()
()。
原因在此背后 :当你在设置适配器之前调用Spinner.Selection()
,只是意味着当它不包含任何数据时我们试图通过setSelection()将微调器设置为自定义索引,或者我们可以说这个微调器具有最大值item = 0。
所以setSelection(1)
表示对于具有max item = 0的微调器,将index设置为1; 虽然微调器本身处理这个outofBoundIndex,所以你的应用程序不会崩溃。
对SetSelection()
调用应仅在setAdapter()之后
此外,如果你有一个Spinner.SetOnItemSelectedListener()
并且你有问题onItemSelected(AdapterView<?> parent, View view, int position, long id)
在活动加载时tiggered与位置值= 0然后你应该使用这种模式。
Spinner.SetAdapter()
Spinner.setSelection();
Spinner.setOnItemSelectedListener();
用这个
sp2.setAdapter(sp2.getAdapter());
sp2.getAdapter().notifyDataSetChanged();
sp2.setSelection(0, false);
试试这个,它对我有用:
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);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.