我正在研究一个android项目,我正在使用一个使用数组适配器的微调器,该数组适配器是从数据库中填充的。
我无法找到如何从列表中以编程方式设置所选项目。例如,如果在微调器中我有以下项目:
创建屏幕时,如何以编程方式将类别2设为选定项目。我认为它可能类似于c#I.E Spinner.SelectedText =“Category 2”但似乎没有任何类似于Android的方法。
使用以下:spinnerObject.setSelection(INDEX_OF_CATEGORY2)
。
这对我有用。
spinner.setSelection(spinner_adapter.getPosition(selected_value)+1);
您可以像这样轻松设置:spinner.setSelection(1)
,而不是1,您可以设置您想要显示的列表的任何位置。
如果你有一个联系人列表,你可以这样做:
((Spinner) view.findViewById(R.id.mobile)).setSelection(spinnerContactPersonDesignationAdapter.getPosition(schoolContact.get(i).getCONT_DESIGNATION()));
我知道已经回答了,但选择一个项目的简单代码非常简单:
spGenre.setSelection( ( (ArrayAdapter) spGenre.getAdapter()).getPosition(client.getGenre()) );
for (int x = 0; x < spRaca.getAdapter().getCount(); x++) {
if (spRaca.getItemIdAtPosition(x) == reprodutor.getId()) {
spRaca.setSelection(x);
break;
}
}
这在本页其他地方的评论中有说明,但认为将其解析为答案是有用的:
当使用适配器时,我发现spinnerObject.setSelection(INDEX_OF_CATEGORY2)
需要在setAdapter
调用之后发生;否则,第一项始终是初始选择。
// spinner setup...
spinnerObject.setAdapter(myAdapter);
spinnerObject.setSelection(INDEX_OF_CATEGORY2);
通过回顾qzxswpoi的AbsSpinner code证实了这一点。
就我而言,这段代码节省了我的一天:
setAdapter
大多数时候public static void selectSpinnerItemByValue(Spinner spnr, long value) {
SpinnerAdapter adapter = spnr.getAdapter();
for (int position = 0; position < adapter.getCount(); position++) {
if(adapter.getItemId(position) == value) {
spnr.setSelection(position);
return;
}
}
}
不起作用。如果你只是打电话给spinner.setSelection(i); //i is 0 to (size-1) of adapter's size
这取决于你的逻辑。
如果视图已完全加载,并且您想从界面调用它,我建议您调用
spinner.setSelection(i);
或者,如果要在活动/片段生命周期之间进行更改,请像这样调用
spinner.setAdapter(spinner_no_of_hospitals.getAdapter());
spinner.setSelection(i); // i is 0 or within adapter size
这是我在Kotlin中使用的:
spinner.post(new Runnable() {
@Override public void run() {
spinner.setSelection(i);
}
});
我已经为spinner.setSelection(resources.getStringArray(R.array.choices).indexOf("Choice 1"))
做了一些扩展功能,用于加载数据和跟踪项目选择。
Spinner.kt
Spinner
用法示例
fun <T> Spinner.load(context: Context, items: List<T>, item: T? = null) {
adapter = ArrayAdapter(context, android.R.layout.simple_spinner_item, items).apply {
setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item)
}
if (item != null && items.isNotEmpty()) setSelection(items.indexOf(item))
}
inline fun Spinner.onItemSelected(
crossinline itemSelected: (
parent: AdapterView<*>,
view: View,
position: Int,
id: Long
) -> Unit
) {
onItemSelectedListener = object : AdapterView.OnItemSelectedListener {
override fun onNothingSelected(parent: AdapterView<*>?) {
}
override fun onItemSelected(parent: AdapterView<*>, view: View, position: Int, id: Long) {
itemSelected.invoke(parent, view, position, id)
}
}
}
这些答案中没有一个给我解决方案,只有这个:
mySpinner.post(new Runnable() {
@Override
public void run() {
mySpinner.setSelection(position);
}
});
这对我有用:
val list = listOf("String 1", "String 2", "String 3")
val defaultData = "String 2"
// load data to spinner
your_spinner.load(context, list, defaultData)
// load data without default selection, it points to first item
your_spinner.load(context, list)
// for watching item selection
your_spinner.onItemSelected { parent, view, position, id ->
// do on item selection
}
它与@ sberezin的解决方案类似,但在onStart()中调用setSelection()。
我从昨天起就遇到了同样的问题。不幸的是,数组列表中的第一项默认显示在微调窗口小部件中。转向是找到包含数组列表中每个元素的前一个选定项目,并将其位置与第一个元素交换。这是代码。
@Override
protected void onStart() {
super.onStart();
mySpinner.setSelection(position);
}
public static void selectSpinnerItemByValue(Spinner spnr, long value) {
SimpleCursorAdapter adapter = (SimpleCursorAdapter) spnr.getAdapter();
for (int position = 0; position < adapter.getCount(); position++) {
if(adapter.getItemId(position) == value) {
spnr.setSelection(position);
return;
}
}
}
您可以使用以上内容:
selectSpinnerItemByValue(spinnerObject, desiredValue);
当然你也可以直接选择索引
spinnerObject.setSelection(index);
一些解释(至少对于碎片 - 从未尝试过纯活动)。希望它能帮助别人更好地理解Android。
Arun George最受欢迎的答案是正确的,但在某些情况下不起作用。 由于额外的CPU负载,Marco HC使用Runnable的答案是最后的手段。
答案是 - 你应该只选择正确的地方来调用setSelection(),例如它适用于我:
@Override
public void onResume() {
super.onResume();
yourSpinner.setSelection(pos);
}
但它不能在onCreateView()中工作。我怀疑这是对这个话题感兴趣的原因。
秘诀是,使用Android,你无法在任何方法中做任何事情 - oops :( - 组件可能还没有准备好。另一个例子 - 你不能在onCreateView()和onResume()中滚动ScrollView(看到答案here)
为什么不使用DB中的值并将它们存储在ArrayList上,然后使用:
yourSpinner.setSelection(yourArrayList.indexOf("Category 1"));
要查找值并选择它:
private void selectValue(Spinner spinner, Object value) {
for (int i = 0; i < spinner.getCount(); i++) {
if (spinner.getItemAtPosition(i).equals(value)) {
spinner.setSelection(i);
break;
}
}
}
您可以像我在UtilityClass中那样为这种工作制作通用方法
public void SetSpinnerSelection(Spinner spinner,String[] array,String text) {
for(int i=0;i<array.length;i++) {
if(array[i].equals(text)) {
spinner.setSelection(i);
}
}
}
最佳解决方案是:
public String[] items= new String[]{"item1","item2","item3"};
// here you can use array or list
ArrayAdapter adapter= new ArrayAdapter(Your_Context, R.layout.support_simple_spinner_dropdown_item, items);
final Spinner itemsSpinner= (Spinner) findViewById(R.id.itemSpinner);
itemsSpinner.setAdapter(adapter);
要获取项目的位置,请自动添加以下语句
itemsSpinner.setSelection(itemsSpinner.getPosition("item2"));
我有一个SimpleCursorAdapter,所以我必须复制数据以便在这篇文章中使用响应。所以,我建议你尝试这种方式:
for (int i = 0; i < spinnerRegion.getAdapter().getCount(); i++) {
if (spinnerRegion.getItemIdAtPosition(i) == Integer
.valueOf(signal.getInt(signal
.getColumnIndexOrThrow("id_region")))) {
spinnerRegion.setSelection(i);
break;
}
}
我认为这是一个真实的方式