كيفية تعيين عنصر محدد من Spinner حسب القيمة ، وليس عن طريق الموضع؟

StackOverflow https://stackoverflow.com/questions/2390102

  •  24-09-2019
  •  | 
  •  

سؤال

لديّ عرض تحديث ، حيث أحتاج إلى إعادة الاتصال بالقيمة المخزنة في قاعدة البيانات لدوران.

كنت في الاعتبار شيئًا كهذا ، لكن Adapter لا يوجد لديه indexOf الطريقة ، لذلك أنا عالق.

void setSpinner(String value)
{
    int pos = getSpinnerField().getAdapter().indexOf(value);
    getSpinnerField().setSelection(pos);
}
هل كانت مفيدة؟

المحلول

لنفترض الخاص بك Spinner تم تسميته mSpinner, ، ويحتوي على أحد خياراتها: "بعض القيمة".

للعثور على ومقارنة موضع "بعض القيمة" في الدوار ، استخدم هذا:

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;
 } 

طريقة إلى الكود المعقدة موجودة بالفعل ، وهذا أمر أكثر وضوحًا.

أحتفظ بقائمة ArrayList منفصلة لجميع العناصر الموجودة في المغازل. وبهذه الطريقة ، يمكنني القيام بفهرسة على قائمة ArrayList ثم استخدام هذه القيمة لتعيين التحديد في الدوار.

مرتكز على إجابة ميريل, لقد توصلت إلى حل خط واحد ... إنه ليس جميلًا جدًا ، لكن يمكنك إلقاء اللوم على من يحافظ على الكود Spinner لإهمال لإدراج وظيفة تقوم بذلك.

mySpinner.setSelection(((ArrayAdapter<String>)mySpinner.getAdapter()).getPosition(myString));

ستحصل على تحذير حول كيفية فريق الممثلين ArrayAdapter<String> لم يتم التحقق منه ... حقًا ، يمكنك فقط استخدام ArrayAdapter كما فعل ميريل ، لكن هذا يتبادل تحذيرًا لآخر.

إذا كنت تستخدم سلسلة سلسلة ، فهذه هي أفضل طريقة:

int selectionPosition= adapter.getPosition("YOUR_VALUE");
spinner.setSelection(selectionPosition);

يمكنك استخدام هذا أيضا ،

String[] baths = getResources().getStringArray(R.array.array_baths);
mSpnBaths.setSelection(Arrays.asList(baths).indexOf(value_here));

إذا كنت بحاجة إلى طريقة فهرس على أي محول قديم (ولا تعرف التنفيذ الأساسي) ، فيمكنك استخدام هذا:

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;
}

استنادًا إلى إجابة Merrill هنا هي كيفية القيام بـ 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;
        }
    }

استخدم السطر التالي لتحديد استخدام القيمة:

mSpinner.setSelection(yourList.indexOf("value"));

هذه هي طريقتي البسيطة للحصول على الفهرس حسب السلسلة.

private int getIndexByString(Spinner spinner, String string) {
    int index = 0;

    for (int i = 0; i < spinner.getCount(); i++) {
        if (spinner.getItemAtPosition(i).toString().equalsIgnoreCase(string)) {
            index = i;
            break;
        }
    }
    return index;
}

أنا أستخدم محولًا مخصصًا ، لأن هذا الرمز يكفي:

yourSpinner.setSelection(arrayAdapter.getPosition("Your Desired Text"));

لذلك ، سيكون مقتطف الرمز الخاص بك هكذا:

void setSpinner(String value)
    {
         yourSpinner.setSelection(arrayAdapter.getPosition(value));
    }

إليك كيفية القيام بذلك إذا كنت تستخدم ملف 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);

        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
    }
}

(ربما ستحتاج أيضًا إلى إغلاق المؤشر ، اعتمادًا على ما إذا كنت تستخدم محملًا.)

أيضا (صقل إجابة أخيل) هذه هي الطريقة المقابلة للقيام بذلك إذا كنت تملأ الدوار الخاص بك من صفيف:

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
    }
};

هذا هو الحل الخاص بي

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;
}

نأمل أن تكون هذه المساعدة!

إذا قمت بتعيين مجموعة 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);
      }
   }
}

هناك بالفعل طريقة للحصول على هذا البحث عن فهرس على المحول ويمكن القيام بكل هذا مع التفكير. حتى أنني ذهبت خطوة واحدة إلى الأمام حيث كان لدي 10 مغازل وأردت تعيينهم ديناميكيًا من قاعدة البيانات الخاصة بي ، وتحتفظ قاعدة البيانات بالقيمة وليس النص فقط لأن الدوار يتغير فعليًا من أسبوع إلى أسبوع ، لذا فإن القيمة هي رقم المعرف الخاص بي من قاعدة البيانات.

 // 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&ltDevice&gt needs to be passed as a List&ltObject&gt or Object[&nbsp] by using 
 * Arrays.asList(device.toArray(&nbsp)).
 * 
 * @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
}

طريقة المصبوب التي يمكن إنشاء لجميع البدائية هنا هي واحدة للسلسلة و 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;
}

لجعل التطبيق تذكر آخر قيم الدوار المحددة ، يمكنك استخدام الكود أدناه:

  1. يقل الرمز يقرأ قيمة الدوار ويضع موضع الدوار وفقًا لذلك.

    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;
    }
    
  2. ووضع الرمز أدناه حيث تعرف أحدث قيم الدوار موجودة ، أو في مكان آخر كما هو مطلوب. تكتب هذه الكود بشكل أساسي قيمة الدوار في المشاركين.

        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();
    

واجهت نفس المشكلة عند محاولة تحديد العنصر الصحيح في سبينر ملوثًا باستخدام جهاز تحميل المؤشر. لقد استرجعت معرف العنصر الذي أردت تحديده أولاً من الجدول 1 ثم استخدمت محمولة مؤشر لملء الدوار. في onloadfised ، قمت بالدورة عبر المؤشر الذي يملأ محول الدوار حتى وجدت العنصر الذي تطابق المعرف الذي كان لدي بالفعل. ثم خصص رقم الصف من المؤشر إلى الموضع المحدد للدوران. سيكون من الجيد أن يكون لديك وظيفة مماثلة لتمرير معرف القيمة التي ترغب في تحديدها في الدوار عند ملء التفاصيل على نموذج يحتوي على نتائج مغزلة محفوظة.

@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 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.R.layout.simple_spinner_item يتم تسليمه بواسطة Android-Studio.

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 في القيم >> السلاسل

لنفترض أنك بحاجة إلى ملء الدوار من المورد من المورد ، وتريد الاحتفاظ بالقيمة من الخادم. لذلك ، هذه طريقة واحدة لتعيين قيمة محددة من الخادم في الدوار.

pincodeSpinner.setSelection(resources.getStringArray(R.array.pincodes).indexOf(javaObject.pincode))

أتمنى أن يساعد! ملاحظة الرمز في كوتلين!

منذ أن كنت بحاجة إلى شيء ما ، يعمل أيضًا الموقع, ، توصلت إلى هاتين الطريقتين:

    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;
    }

كما ترون ، تعثرت أيضًا على تعقيد إضافي من حساسية القضية بين المصفوفات. 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();
    }

يمكنك استخدام هذه الطريقة ، فقط اجعل الكود الخاص بك أكثر بساطة وأكثر وضوحًا.

ArrayAdapter<String> adapter = (ArrayAdapter<String>) spinnerCountry.getAdapter();
int position = adapter.getPosition(obj.getCountry());
spinnerCountry.setSelection(position);

أتمنى أن يساعد ذلك.

يجب عليك تمرير محولك المخصص مع موضع مثل التكرار [الموضع]. وهو يعمل بشكل صحيح.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top