以编程方式设置微调器的选定项
Posted
技术标签:
【中文标题】以编程方式设置微调器的选定项【英文标题】:Set selected item of spinner programmatically 【发布时间】:2012-06-19 19:35:45 【问题描述】:我正在开发一个 android 项目,我正在使用一个微调器,它使用从数据库填充的数组适配器。
我不知道如何以编程方式从列表中设置所选项目。例如,如果在微调器中我有以下项目:
1 类 2 类 第 3 类如何在创建屏幕时以编程方式将类别 2 设为选定项目。我在想它可能类似于 c# I.E Spinner.SelectedText = "Category 2" 但对于 Android 似乎没有任何类似的方法。
【问题讨论】:
请点击此链接:[如何在微调器项目上设置选择][1] [1]:***.com/questions/16358563/… 您可以将您的索引传递给spinner.setSelection()
。那会很好用。您还可以创建一个方法来帮助您将索引与其实际字符串匹配。
【参考方案1】:
使用以下内容:
spinnerObject.setSelection(INDEX_OF_CATEGORY2)
.
【讨论】:
谢谢,这很好用,当我这样做时,我还找到了一种无需遍历适配器即可获取索引的方法。我使用了以下mySpinner.setSelection(arrayAdapter.getPosition("Category 2"));
如果您没有要参考的适配器。 mySpinner.setSelection(((ArrayAdapter)mySpinner.getAdapter()).getPosition("Value"));
sexSpinner.setSelection(adapter.getPosition(mUser.getGender()) == -1 ? 0 : adapter.getPosition(mUser.getGender()));
在 setAdapter() 之后调用 SetSelection() 似乎总是显示第一项(Android 2.3),即使在 dropView 中选择了好的一项。添加 view.post() (@Marco Hernaiz Cao 回答)为我修复它。
如果 Spinner 有一个 onItemSelectedListener(),这不起作用。不会调用 Listener。【参考方案2】:
这些答案都没有给我解决方案,只能解决这个问题:
mySpinner.post(new Runnable()
@Override
public void run()
mySpinner.setSelection(position);
);
【讨论】:
我在 setAdapter() 之后调用了 SetSelection()。这始终显示第一项(Android 2.3),即使在 dropView 中选择了好的一项。您的解决方案为我做到了。 谢谢,成功了! btw 适用于 ListView.post.run() performItemClick() 以及 如何根据大小选择最后一个?【参考方案3】: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);
【讨论】:
此代码的一个错误是@Boardy 想要选择Category 2
,我认为这是一个字符串(假设他尝试使用Spinner.SelectedText = "Category 2"
)但上面的代码是针对long
。
他正在从数据库中填充类别,每个类别都必须有一个 ID。
为什么假设它是一个 CursorAdapter? SpinnerAdapter 也能正常工作。
我觉得你这里搞错了,应该是adapter.getItem(position)
,而不是adapter.getItemId(position)
。【参考方案4】:
一些解释(至少对于 Fragments - 从未尝试过纯 Activity)。希望它可以帮助人们更好地了解 Android。
Arun George 最受欢迎的答案是正确的,但在某些情况下不起作用。 Marco HC 的答案使用 Runnable,由于额外的 CPU 负载,这是最后的手段。
答案是 - 您应该选择正确的位置来调用 setSelection(),例如它对我有用:
@Override
public void onResume()
super.onResume();
yourSpinner.setSelection(pos);
但它在 onCreateView() 中不起作用。我怀疑这就是对这个话题感兴趣的原因。
秘密在于,在 Android 中,您无法以任何方法执行任何操作 - 哎呀:( - 组件可能还没有准备好。再举一个例子 - 您既不能在 onCreateView() 也不能在 onResume() 中滚动 ScrollView(看答案here)
【讨论】:
谢谢 - 我不知道 Fragments 有 onResume 方法。 我会的,我可以给 +18,这样你的答案就会高于@Marco HC。你是唯一一个试图按照应有的方式做事的人【参考方案5】:要找到一个值并选择它:
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;
【讨论】:
【参考方案6】:为什么不使用数据库中的值并将它们存储在 ArrayList 中,然后使用:
yourSpinner.setSelection(yourArrayList.indexOf("Category 1"));
【讨论】:
使用 DataAdapter 的各种解决方案对我不起作用,但使用在此示例中构建值的 ArrayList 可以解决问题。【参考方案7】:最优解是:
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);
要自动获取item的位置,添加如下语句
itemsSpinner.setSelection(itemsSpinner.getPosition("item2"));
【讨论】:
无法解析“Spinner”中的“getPosition”方法 对于getPosition()
使用像spinnerAdapter.getPosition()
这样的adpater。它将解决您的问题。 @PedroJoaquín【参考方案8】:
您可以为这种工作创建一个通用方法,就像我在我的 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);
【讨论】:
【参考方案9】:您可以轻松设置为:spinner.setSelection(1)
,而不是 1,您可以设置您想要显示的列表的任何位置。
【讨论】:
【参考方案10】:我有一个 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;
我认为这是一种真正的方式
【讨论】:
是的,如果是 SimpleCursorAdapter,spinnerRegion.getItemIdAtPosition(i) 会给出一个 Cursor,可以用来获取列。【参考方案11】:我知道已经回答了,但是选择一项的简单代码,很简单:
spGenre.setSelection( ( (ArrayAdapter) spGenre.getAdapter()).getPosition(client.getGenre()) );
【讨论】:
【参考方案12】:这对我有用。
spinner.setSelection(spinner_adapter.getPosition(selected_value)+1);
【讨论】:
+1 怎么样? 因为是从0开始所以要加一个才能得到正确答案 getposition 可以为第一个索引返回 0【参考方案13】:这是我在 Kotlin 中使用的:
spinner.setSelection(resources.getStringArray(R.array.choices).indexOf("Choice 1"))
【讨论】:
如果indexOf
无法匹配,则返回-1
,这似乎导致spinner.setSelection
选择了默认值。我没关系。【参考方案14】:
如果您有联系人列表,您可以这样做:
((Spinner) view.findViewById(R.id.mobile)).setSelection(spinnerContactPersonDesignationAdapter.getPosition(schoolContact.get(i).getCONT_DESIGNATION()));
【讨论】:
【参考方案15】: for (int x = 0; x < spRaca.getAdapter().getCount(); x++)
if (spRaca.getItemIdAtPosition(x) == reprodutor.getId())
spRaca.setSelection(x);
break;
【讨论】:
您能否添加一些文字来解释您的答案?【参考方案16】:这在本页其他地方的 cmets 中有所说明,但认为将其提取到答案中很有用:
使用适配器时,我发现spinnerObject.setSelection(INDEX_OF_CATEGORY2)
需要发生在setAdapter
调用之后;否则,第一项始终是初始选择。
// spinner setup...
spinnerObject.setAdapter(myAdapter);
spinnerObject.setSelection(INDEX_OF_CATEGORY2);
通过查看 AbsSpinner code for setAdapter
可以确认这一点。
【讨论】:
当然,只有在适配器填满后才能选择项目。【参考方案17】:这是我正在使用的 Kotlin 扩展:
fun Spinner.setItem(list: Array<CharSequence>, value: String)
val index = list.indexOf(value)
this.post this.setSelection(index)
用法:
spinnerPressure.setItem(resources.getTextArray(R.array.array_pressure), pressureUnit)
【讨论】:
【参考方案18】:是的,您可以通过在微调器的 setSelection 函数中传递所需微调器项的索引来实现此目的。例如:
spinnerObject.setSelection(INDEX_OF_CATEGORY)。
【讨论】:
【参考方案19】:在 Kotlin 中,我找到了一个使用 lambda 的简单解决方案:
spinnerObjec.post spinnerObjec.setSelection(yourIndex)
【讨论】:
这个问题有 24 个现有答案,包括一个接受了 843 (!!!) upvotes 的答案。您确定尚未提供您的答案吗?如果不是,为什么有人会更喜欢您的方法而不是提议的现有方法?您是否正在利用新功能?是否存在更适合您的方法的场景?【参考方案20】:就我而言,这段代码拯救了我的一天:
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;
【讨论】:
你不需要这样做。适配器有一个返回 int 位置的 getPosition(item) 调用。【参考方案21】:大多数时候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
或者,如果您想在活动/片段生命周期之间进行更改,请像这样调用
spinner.post(new Runnable()
@Override public void run()
spinner.setSelection(i);
);
【讨论】:
【参考方案22】:我做了一些Spinner
的扩展功能,用于加载数据和跟踪项目选择。
Spinner.kt
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)
用法示例
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
【讨论】:
【参考方案23】:这对我有用:
mySpinner.post(new Runnable()
@Override
public void run()
mySpinner.setSelection(position);
spinnerAdapter.notifyDataSetChanged();
);
【讨论】:
【参考方案24】:这对我有用:
@Override
protected void onStart()
super.onStart();
mySpinner.setSelection(position);
它类似于@sberezin 的解决方案,但在 onStart() 中调用 setSelection()。
【讨论】:
【参考方案25】:从昨天开始我遇到了同样的问题。不幸的是,数组列表中的第一项默认显示在微调器小部件中。一个周转方法是找到数组列表中每个元素的上一个选定项,并将其位置与第一个元素。这里是代码。
OnResume()
int before_index = ShowLastSelectedElement();
if (isFound)
Collections.swap(yourArrayList,before_index,0);
adapter = new ArrayAdapter<String>(CurrentActivity.this,
android.R.layout.simple_spinner_item, yourArrayList);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item; yourListView.setAdapter(adapter);
...
private int ShowLastSelectedElement()
String strName = "";
int swap_index = 0;
for (int i=0;i<societies.size();i++)
strName = yourArrayList.get(i);
if (strName.trim().toLowerCase().equals(lastselectedelement.trim().toLowerCase()))
swap_index = i;
isFound = true;
return swap_index;
【讨论】:
以上是关于以编程方式设置微调器的选定项的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 MVVM 应用程序在 WPF 中以编程方式设置 DataGrid 的选定项?
magnific popup:以编程方式将内容从弹出表单更改为模态微调器,然后返回表单