我有一个更新视图,我需要为Spinner预先选择存储在数据库中的值。
我想到的是这样的事情,但Adapter
没有indexOf
方法,所以我被卡住了。
void setSpinner(String value)
{
int pos = getSpinnerField().getAdapter().indexOf(value);
getSpinnerField().setSelection(pos);
}
答案 0 :(得分:598)
假设您的Spinner
名为mSpinner
,并且其中包含以下选项之一:“某些值”。
要查找并比较Spinner中“某些值”的位置,请使用:
String compareValue = "some value";
ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(this, R.array.select_state, android.R.layout.simple_spinner_item);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
mSpinner.setAdapter(adapter);
if (compareValue != null) {
int spinnerPosition = adapter.getPosition(compareValue);
mSpinner.setSelection(spinnerPosition);
}
答案 1 :(得分:125)
基于值设置微调器的简单方法是
mySpinner.setSelection(getIndex(mySpinner, myValue));
//private method of your class
private int getIndex(Spinner spinner, String myString){
for (int i=0;i<spinner.getCount();i++){
if (spinner.getItemAtPosition(i).toString().equalsIgnoreCase(myString)){
return i;
}
}
return 0;
}
复杂代码的方法已经存在,这只是更简单。
答案 2 :(得分:34)
我在Spinners中保留了所有项目的单独ArrayList。这样我可以在ArrayList上执行indexOf,然后使用该值在Spinner中设置选择。
答案 3 :(得分:27)
基于Merrill's answer,我想出了这个单行解决方案......它不是很漂亮,但你可以责怪谁维护Spinner
的代码而忽略了包含一个执行此操作的函数为此。
mySpinner.setSelection(((ArrayAdapter<String>)mySpinner.getAdapter()).getPosition(myString));
你会收到关于如何取消选中ArrayAdapter<String>
的投射的警告......实际上,你可以像Merrill那样使用ArrayAdapter
,但这只是为另一个警告交换一个警告。
答案 4 :(得分:10)
如果你使用字符串数组,这是最好的方法:
int selectionPosition= adapter.getPosition("YOUR_VALUE");
spinner.setSelection(selectionPosition);
答案 5 :(得分:8)
如果您需要在任何旧适配器上使用indexOf方法(并且您不知道底层实现),那么您可以使用它:
private int indexOf(final Adapter adapter, Object value)
{
for (int index = 0, count = adapter.getCount(); index < count; ++index)
{
if (adapter.getItem(index).equals(value))
{
return index;
}
}
return -1;
}
答案 6 :(得分:8)
你也可以使用它,
String[] baths = getResources().getStringArray(R.array.array_baths);
mSpnBaths.setSelection(Arrays.asList(baths).indexOf(value_here));
答案 7 :(得分:7)
根据美林的回答 这是如何处理CursorAdapter
CursorAdapter myAdapter = (CursorAdapter) spinner_listino.getAdapter(); //cast
for(int i = 0; i < myAdapter.getCount(); i++)
{
if (myAdapter.getItemId(i) == ordine.getListino() )
{
this.spinner_listino.setSelection(i);
break;
}
}
答案 8 :(得分:5)
使用以下行选择使用值:
mSpinner.setSelection(yourList.indexOf("value"));
答案 9 :(得分:3)
这是我通过字符串获取索引的简单方法。
1
20 2
4 40 3
答案 10 :(得分:2)
我正在使用自定义适配器,因为这段代码足够了:
yourSpinner.setSelection(arrayAdapter.getPosition("Your Desired Text"));
因此,您的代码段将如下所示:
void setSpinner(String value)
{
yourSpinner.setSelection(arrayAdapter.getPosition(value));
}
答案 11 :(得分:2)
如果您使用local a = {1, 2, 3}
local b = {1, 2, 3, 4, 5, 6}
local c = {}
for k,v in ipairs(b) do
local foundkey = 0
for _k,_v in ipairs(a) do
if _v == v then
foundkey = _k
end
end
if foundkey == 0 then
table.insert(c,v)
end
end
a = c
-- Output a = {4, 5, 6}
(其中SimpleCursorAdapter
是您用来填充columnName
的数据库列的名称),请执行以下操作:
spinner
(也许您还需要关闭光标,具体取决于您是否使用了加载程序。)
另外(Akhil's answer的细化)如果从数组中填充Spinner,这是相应的方法:
private int getIndex(Spinner spinner, String columnName, String searchString) {
//Log.d(LOG_TAG, "getIndex(" + searchString + ")");
if (searchString == null || spinner.getCount() == 0) {
return -1; // Not found
}
else {
Cursor cursor = (Cursor)spinner.getItemAtPosition(0);
for (int i = 0; i < spinner.getCount(); i++) {
cursor.moveToPosition(i);
String itemText = cursor.getString(cursor.getColumnIndex(columnName));
if (itemText.equals(searchString)) {
return i;
}
}
return -1; // Not found
}
}
答案 12 :(得分:1)
这是我的解决方案
List<Country> list = CountryBO.GetCountries(0);
CountriesAdapter dataAdapter = new CountriesAdapter(this,list);
dataAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spnCountries.setAdapter(dataAdapter);
spnCountries.setSelection(dataAdapter.getItemIndexById(userProfile.GetCountryId()));
和getItemIndexById
public int getItemIndexById(String id) {
for (Country item : this.items) {
if(item.GetId().toString().equals(id.toString())){
return this.items.indexOf(item);
}
}
return 0;
}
希望这有帮助!
答案 13 :(得分:1)
如果您将XML数组设置为XML布局中的微调框,则可以这样做
final Spinner hr = v.findViewById(R.id.chr);
final String[] hrs = getResources().getStringArray(R.array.hours);
if(myvalue!=null){
for (int x = 0;x< hrs.length;x++){
if(myvalue.equals(hrs[x])){
hr.setSelection(x);
}
}
}
答案 14 :(得分:0)
您可以使用这种方式,只是使您的代码更简单,更清晰。
ArrayAdapter<String> adapter = (ArrayAdapter<String>) spinnerCountry.getAdapter();
int position = adapter.getPosition(obj.getCountry());
spinnerCountry.setSelection(position);
希望有帮助。
答案 15 :(得分:0)
由于我需要一些可以与 Localization 一起使用的方法,因此我想到了以下两种方法:
private int getArrayPositionForValue(final int arrayResId, final String value) {
final Resources english = Utils.getLocalizedResources(this, new Locale("en"));
final List<String> arrayValues = Arrays.asList(english.getStringArray(arrayResId));
for (int position = 0; position < arrayValues.size(); position++) {
if (arrayValues.get(position).equalsIgnoreCase(value)) {
return position;
}
}
Log.w(TAG, "getArrayPosition() --> return 0 (fallback); No index found for value = " + value);
return 0;
}
如您所见,我还偶然发现arrays.xml与我要比较的value
之间的区分大小写的其他复杂性。
如果您没有此方法,则可以将上述方法简化为:
return arrayValues.indexOf(value);
public static Resources getLocalizedResources(Context context, Locale desiredLocale) {
Configuration conf = context.getResources().getConfiguration();
conf = new Configuration(conf);
conf.setLocale(desiredLocale);
Context localizedContext = context.createConfigurationContext(conf);
return localizedContext.getResources();
}
答案 16 :(得分:0)
假设您需要从资源的字符串数组中填充微调框,并且想要保持从服务器中选择的值。 因此,这是在微调器中设置从服务器选择值的一种方法。
pincodeSpinner.setSelection(resources.getStringArray(R.array.pincodes).indexOf(javaObject.pincode))
希望有帮助! 附言代码在科特林!
答案 17 :(得分:0)
非常简单,只需使用getSelectedItem();
例如:
ArrayAdapter<CharSequence> type=ArrayAdapter.createFromResource(this,R.array.admin_typee,android.R.layout.simple_spinner_dropdown_item);
type.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
mainType.setAdapter(type);
String group=mainType.getSelectedItem().toString();
上述方法返回一个字符串值
上方R.array.admin_type
中的是一个值包含字符串的文件资源
只需在值>>字符串中创建一个.xml文件
答案 18 :(得分:0)
YourAdapter yourAdapter =
new YourAdapter (getActivity(),
R.layout.list_view_item,arrData);
yourAdapter .setDropDownViewResource(R.layout.list_view_item);
mySpinner.setAdapter(yourAdapter );
String strCompare = "Indonesia";
for (int i = 0; i < arrData.length ; i++){
if(arrData[i].getCode().equalsIgnoreCase(strCompare)){
int spinnerPosition = yourAdapter.getPosition(arrData[i]);
mySpinner.setSelection(spinnerPosition);
}
}
答案 19 :(得分:0)
这是我希望完整的解决方案。我有以下枚举:
public enum HTTPMethod {GET, HEAD}
用于以下课程
public class WebAddressRecord {
...
public HTTPMethod AccessMethod = HTTPMethod.HEAD;
...
通过HTTPMethod enum-member设置微调器的代码:
Spinner mySpinner = (Spinner) findViewById(R.id.spinnerHttpmethod);
ArrayAdapter<HTTPMethod> adapter = new ArrayAdapter<HTTPMethod>(this, android.R.layout.simple_spinner_item, HTTPMethod.values());
mySpinner.setAdapter(adapter);
int selectionPosition= adapter.getPosition(webAddressRecord.AccessMethod);
mySpinner.setSelection(selectionPosition);
在布局文件中定义R.id.spinnerHttpmethod
,而android-studio提供android.R.layout.simple_spinner_item
。
答案 20 :(得分:0)
由于以前的一些答案非常正确,我只想确保你们中没有人遇到这样的问题。
如果使用ArrayList
将值设置为String.format
,则必须使用相同的字符串结构String.format
获取值的位置。
示例:
ArrayList<String> myList = new ArrayList<>();
myList.add(String.format(Locale.getDefault() ,"%d", 30));
myList.add(String.format(Locale.getDefault(), "%d", 50));
myList.add(String.format(Locale.getDefault(), "%d", 70));
myList.add(String.format(Locale.getDefault(), "%d", 100));
你必须得到所需价值的位置:
myList.setSelection(myAdapter.getPosition(String.format(Locale.getDefault(), "%d", 70)));
否则,您将收到-1
,找不到项目!
由于阿拉伯语,我使用了Locale.getDefault()
。
我希望这会对你有所帮助。
答案 21 :(得分:0)
实际上有一种方法可以使用AdapterArray上的索引搜索来实现这一点,所有这些都可以通过反射完成。我甚至更进一步,因为我有10个Spinners,并且想要从我的数据库中动态设置它们,并且数据库只保留值,而不是文本,因为Spinner实际上每周都会更改,因此值是我在数据库中的id号。 / p>
// Get the JSON object from db that was saved, 10 spinner values already selected by user
JSONObject json = new JSONObject(string);
JSONArray jsonArray = json.getJSONArray("answer");
// get the current class that Spinner is called in
Class<? extends MyActivity> cls = this.getClass();
// loop through all 10 spinners and set the values with reflection
for (int j=1; j< 11; j++) {
JSONObject obj = jsonArray.getJSONObject(j-1);
String movieid = obj.getString("id");
// spinners variable names are s1,s2,s3...
Field field = cls.getDeclaredField("s"+ j);
// find the actual position of value in the list
int datapos = indexedExactSearch(Arrays.asList(Arrays.asList(this.data).toArray()), "value", movieid) ;
// find the position in the array adapter
int pos = this.adapter.getPosition(this.data[datapos]);
// the position in the array adapter
((Spinner)field.get(this)).setSelection(pos);
}
只要字段位于对象的顶层,就可以在几乎任何列表中使用索引搜索。
/**
* Searches for exact match of the specified class field (key) value within the specified list.
* This uses a sequential search through each object in the list until a match is found or end
* of the list reached. It may be necessary to convert a list of specific objects into generics,
* ie: LinkedList<Device> needs to be passed as a List<Object> or Object[ ] by using
* Arrays.asList(device.toArray( )).
*
* @param list - list of objects to search through
* @param key - the class field containing the value
* @param value - the value to search for
* @return index of the list object with an exact match (-1 if not found)
*/
public static <T> int indexedExactSearch(List<Object> list, String key, String value) {
int low = 0;
int high = list.size()-1;
int index = low;
String val = "";
while (index <= high) {
try {
//Field[] c = list.get(index).getClass().getDeclaredFields();
val = cast(list.get(index).getClass().getDeclaredField(key).get(list.get(index)) , "NONE");
} catch (SecurityException e) {
e.printStackTrace();
} catch (NoSuchFieldException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
if (val.equalsIgnoreCase(value))
return index; // key found
index = index + 1;
}
return -(low + 1); // key not found return -1
}
这里可以为所有基元创建的Cast方法是一个用于string和int。
/**
* Base String cast, return the value or default
* @param object - generic Object
* @param defaultValue - default value to give if Object is null
* @return - returns type String
*/
public static String cast(Object object, String defaultValue) {
return (object!=null) ? object.toString() : defaultValue;
}
/**
* Base integer cast, return the value or default
* @param object - generic Object
* @param defaultValue - default value to give if Object is null
* @return - returns type integer
*/
public static int cast(Object object, int defaultValue) {
return castImpl(object, defaultValue).intValue();
}
/**
* Base cast, return either the value or the default
* @param object - generic Object
* @param defaultValue - default value to give if Object is null
* @return - returns type Object
*/
public static Object castImpl(Object object, Object defaultValue) {
return object!=null ? object : defaultValue;
}
答案 22 :(得分:0)
要使应用程序记住最后选择的微调器值,您可以使用以下代码:
下面的代码读取微调器值并相应地设置微调器位置。
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
int spinnerPosition;
Spinner spinner1 = (Spinner) findViewById(R.id.spinner1);
ArrayAdapter<CharSequence> adapter1 = ArrayAdapter.createFromResource(
this, R.array.ccy_array,
android.R.layout.simple_spinner_dropdown_item);
adapter1.setDropDownViewResource(android.R.layout.simple_list_item_activated_1);
// Apply the adapter to the spinner
spinner1.setAdapter(adapter1);
// changes to remember last spinner position
spinnerPosition = 0;
String strpos1 = prfs.getString("SPINNER1_VALUE", "");
if (strpos1 != null || !strpos1.equals(null) || !strpos1.equals("")) {
strpos1 = prfs.getString("SPINNER1_VALUE", "");
spinnerPosition = adapter1.getPosition(strpos1);
spinner1.setSelection(spinnerPosition);
spinnerPosition = 0;
}
并在下面的代码中放置您知道最新微调器值的代码,或者根据需要放在其他位置。 这段代码基本上将微调器值写在SharedPreferences中。
Spinner spinner1 = (Spinner) findViewById(R.id.spinner1);
String spinlong1 = spinner1.getSelectedItem().toString();
SharedPreferences prfs = getSharedPreferences("WHATEVER",
Context.MODE_PRIVATE);
SharedPreferences.Editor editor = prfs.edit();
editor.putString("SPINNER1_VALUE", spinlong1);
editor.commit();
答案 23 :(得分:0)
尝试在使用cursorLoader填充的微调器中选择正确的项时,我遇到了同样的问题。我从表1中检索了我想要选择的项的id,然后使用CursorLoader填充微调器。在onLoadFinished我循环通过光标填充微调器的适配器,直到我找到与我已经拥有的id匹配的项目。然后将光标的行号分配给微调器的选定位置。当在包含已保存的微调器结果的表单上填充详细信息时,使用类似的函数传递要在微调器中选择的值的id会很好。
@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) {
adapter.swapCursor(cursor);
cursor.moveToFirst();
int row_count = 0;
int spinner_row = 0;
while (spinner_row < 0 || row_count < cursor.getCount()){ // loop until end of cursor or the
// ID is found
int cursorItemID = bCursor.getInt(cursor.getColumnIndexOrThrow(someTable.COLUMN_ID));
if (knownID==cursorItemID){
spinner_row = row_count; //set the spinner row value to the same value as the cursor row
}
cursor.moveToNext();
row_count++;
}
}
spinner.setSelection(spinner_row ); //set the selected item in the spinner
}
答案 24 :(得分:-3)
你必须通过REPEAT [position]这样的位置传递自定义适配器。它运作正常。