답변:
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);
}
값을 기준으로 스피너를 설정하는 간단한 방법은
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;
}
복잡한 코드로가는 길은 이미 존재합니다.
break;
프로세스 속도를 높이기 위해 색인이 발견되면 추가하는 것을 잊었습니다 .
0
백업 시나리오로 작성 했습니다. 을 설정하면 -1
스피너에서 볼 수있는 항목이 있습니다. 스피너 어댑터의 0 번째 요소를 가정하고 -1을 추가하면 값이 -1인지 여부를 과체중으로 추가하므로 설정 -1로 인해 예외가 발생합니다.
Spinners의 모든 항목에 대해 별도의 ArrayList를 유지합니다. 이렇게하면 ArrayList에서 indexOf를 수행 한 다음 해당 값을 사용하여 Spinner에서 선택을 설정할 수 있습니다.
Merrill의 답변을 바탕 으로이 단일 라인 솔루션을 생각해 냈습니다 ... 매우 예쁘지는 않지만이 Spinner
기능을 포함하지 않는 코드를 유지 관리하는 사람을 비난 할 수 있습니다 .
mySpinner.setSelection(((ArrayAdapter<String>)mySpinner.getAdapter()).getPosition(myString));
에 대한 캐스트 ArrayAdapter<String>
가 확인되지 않은 방법에 대한 경고가 표시됩니다 . 실제로 ArrayAdapter
Merrill처럼 a를 사용할 수 는 있지만 하나의 경고를 다른 경고로 교환합니다.
이것을 사용할 수도 있습니다.
String[] baths = getResources().getStringArray(R.array.array_baths);
mSpnBaths.setSelection(Arrays.asList(baths).indexOf(value_here));
이 방법을 사용하면 코드를 더 간단하고 명확하게 만들 수 있습니다.
ArrayAdapter<String> adapter = (ArrayAdapter<String>) spinnerCountry.getAdapter();
int position = adapter.getPosition(obj.getCountry());
spinnerCountry.setSelection(position);
도움이 되길 바랍니다.
여기 내 해결책이 있습니다
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;
}
이 도움을 바랍니다!
다음을 사용하는 경우 수행 방법은 다음과 같습니다 SimpleCursorAdapter
(여기서는 columnName
을 채우는 데 사용 된 db 열의 이름 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);
int initialCursorPos = cursor.getPosition(); // Remember for later
int index = -1; // Not found
for (int i = 0; i < spinner.getCount(); i++) {
cursor.moveToPosition(i);
String itemText = cursor.getString(cursor.getColumnIndex(columnName));
if (itemText.equals(searchString)) {
index = i; // Found!
break;
}
}
cursor.moveToPosition(initialCursorPos); // Leave cursor as we found it.
return index;
}
}
또한 ( Akhil 's answer 의 개선 ) 이것은 배열에서 Spinner를 채우는 경우 해당하는 방법입니다.
private int getIndex(Spinner spinner, String searchString) {
if (searchString == null || spinner.getCount() == 0) {
return -1; // Not found
}
else {
for (int i = 0; i < spinner.getCount(); i++) {
if (spinner.getItemAtPosition(i).toString().equals(searchString)) {
return i; // Found!
}
}
return -1; // Not found
}
};
실제로 AdapterArray에서 인덱스 검색을 사용하여이를 얻을 수있는 방법이 있으며이 모든 것을 반영하여 수행 할 수 있습니다. 10 개의 Spinner가 있고 데이터베이스에서 동적으로 설정하고 싶었으므로 한 단계 더 나아가서 Spinner가 실제로 주마다 변경되므로 데이터베이스는 텍스트가 아닌 값만 보유하므로 값은 데이터베이스의 내 id 번호입니다.
// 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
}
여기서 모든 프리미티브에 대해 생성 할 수있는 캐스트 방법은 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;
}
응용 프로그램이 마지막으로 선택한 스피너 값을 기억하게하려면 아래 코드를 사용할 수 있습니다.
아래 코드는 스피너 값을 읽고 스피너 위치를 적절하게 설정합니다.
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;
}
그리고 최신 스피너 값이 있거나 필요한 다른 곳에 코드를 아래에 넣으십시오. 이 코드는 기본적으로 Spinner 값을 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();
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
}
이전 답변 중 일부가 옳았 으므로이 문제에 빠지지 않도록하십시오.
당신이에 값을 설정하면 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()
때문에 사용했습니다 .
도움이 되길 바랍니다.
희망적으로 완전한 해결책이 있습니다. 나는 다음과 같은 열거 형을 가지고있다 :
public enum HTTPMethod {GET, HEAD}
다음 클래스에서 사용
public class WebAddressRecord {
...
public HTTPMethod AccessMethod = HTTPMethod.HEAD;
...
HTTPMethod 열거 형 멤버로 스피너를 설정하는 코드 :
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.R.layout.simple_spinner_item
안드로이드 스튜디오에 의해 제공됩니다.
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);
}
}
매우 간단한 사용 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 파일을 만드십시오.
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();
}