Spinner himself

<Spinner android:layout_width="200dp" android:layout_height="wrap_content" android:id="@+id/spinner" android:spinnerMode="dropdown" android:layout_alignParentTop="true" android:layout_centerHorizontal="true" android:gravity="center" /> 

How do I fill it with data (from the muscle):

 public class ask_phone extends AppCompatActivity implements View.OnClickListener { private FillMap loader; ///объект класса public SparseStringsAdapter adapter; SparseArray mCities = new SparseArray(); /// id,naim @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.ask_phone); ///выдернем данные о городах loader = new FillMap(); loader.execute("http://somesite.ru/get_data.php?_mode=getCity"); } ///класс для получаения данных с внешнего ресурса и заполнения выпадающего списка данными private class FillMap extends AsyncTask<String, String, String> { HttpURLConnection urlConnection = null; BufferedReader reader = null; String resultJson = ""; @Override protected String doInBackground(String... urls) { // получаем данные с внешнего ресурса try { URL url = new URL(urls[0]); urlConnection = (HttpURLConnection) url.openConnection(); urlConnection.setRequestMethod("GET"); urlConnection.setReadTimeout(10000); urlConnection.connect(); InputStream inputStream = urlConnection.getInputStream(); /// Log.d(LOG_TAG,"inputStream "+inputStream); StringBuffer buffer = new StringBuffer(); reader = new BufferedReader(new InputStreamReader(inputStream)); String line; while ((line = reader.readLine()) != null) { buffer.append(line); } resultJson = buffer.toString(); urlConnection.disconnect(); return resultJson; } catch (Exception e) { Log.d(LOG_TAG, "o fack " + e); e.printStackTrace(); return "-1"; } finally { urlConnection.disconnect(); } } @Override protected void onPostExecute(String s) { super.onPostExecute(s); JSONObject dataJsonObj = null; if (s != "-1") try { dataJsonObj = new JSONObject(s); int success = dataJsonObj.getInt("success"); if (success == 1) { ///если данные удалось достать String _mode = dataJsonObj.getString("_mode"); switch (_mode) { case "getCity": ///вытаскиваем все города JSONArray cities = dataJsonObj.getJSONArray("cities"); for (int i = 0; i < cities.length(); i++) { try { JSONObject city = cities.getJSONObject(i); int wId = city.getInt("id"); String city_name = city.getString("city_name"); mCities.put(wId,city_name); } catch (Exception e) { Log.d(LOG_TAG, "shit 1" + e); } } // адаптер adapter = new SparseStringsAdapter(ask_phone.this,mCities); /// adapter. Spinner spinner = (Spinner) findViewById(R.id.spinner); spinner.setAdapter(adapter); // заголовок spinner.setPrompt("Список городов"); // выделяем элемент spinner.setSelection((int) (MapsActivity.mCity-1)); // устанавливаем обработчик нажатия cityId = adapter.getItemId(1); spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { @Override public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { /// Toast.makeText(ask_phone.this, adapter.getItem(position)+"-"+adapter.getItemId(position), Toast.LENGTH_SHORT).show(); cityId = adapter.getItemId(position); } @Override public void onNothingSelected(AdapterView<?> parent) { } }); break; } }///of if } catch (JSONException e) { e.printStackTrace(); } } } public abstract class SparseArrayAdapter<E> extends BaseAdapter { /// http://stackoverflow.com/questions/21677866/how-to-use-sparsearray-as-a-source-for-adapter?answertab=votes#tab-top private SparseArray<E> mData; public void setData(SparseArray<E> data) { mData = data; } @Override public int getCount() { return mData.size(); } @Override public E getItem(int position) { return mData.valueAt(position); } @Override public long getItemId(int position) { return mData.keyAt(position); } } public class SparseStringsAdapter extends SparseArrayAdapter<String> { private final LayoutInflater mInflater; public SparseStringsAdapter(Context context, SparseArray<String> data) { mInflater = LayoutInflater.from(context); setData(data); } @Override public View getView(int position, View convertView, ViewGroup parent) { TextView result = (TextView) convertView; if (result == null) { result = (TextView) mInflater.inflate(android.R.layout.simple_list_item_1, null); } Log.d(LOG_TAG,"result = "+result.getId()); Log.d(LOG_TAG,"getItem(position) = "+getItem(position)); result.setText(getItem(position)); return result; } } 

}

Falls on the line result.setText (getItem (position)); (at the very bottom), although the logs above this line give out some data.

When this class inherits from Activity, everything worked, but the ActionBar is not shown in it, and AppCompatActivity falls with an error.

Tell me how to make it work

upd Stacktrace:

 0java.lang.NullPointerException: Attempt to read from field 'int android.view.ViewGroup$LayoutParams.width' on a null object reference 1 at android.widget.TextView.checkForRelayout(TextView.java:7048) 2 at android.widget.TextView.setText(TextView.java:4070) 3 at android.widget.TextView.setText(TextView.java:3928) 4 at android.widget.TextView.setText(TextView.java:3903) 5 at com.example.necro.googlemaps.ask_phone$SparseStringsAdapter.getView(ask_phone.java:500) 6 at android.widget.BaseAdapter.getDropDownView(BaseAdapter.java:71) 7 at android.support.v7.widget.AppCompatSpinner$DropDownAdapter.getDropDownView(AppCompatSpinner.java:624) 8 at android.support.v7.widget.AppCompatSpinner$DropDownAdapter.getView(AppCompatSpinner.java:620) 9 at android.support.v7.internal.widget.ListViewCompat.measureHeightOfChildrenCompat(ListViewCompat.java:290) 10 at android.support.v7.widget.ListPopupWindow.buildDropDown(ListPopupWindow.java:1200) 11 at android.support.v7.widget.ListPopupWindow.show(ListPopupWindow.java:584) 12 at android.support.v7.widget.AppCompatSpinner$DropdownPopup.show(AppCompatSpinner.java:766) 13 at android.support.v7.widget.AppCompatSpinner.performClick(AppCompatSpinner.java:424) 14 at android.view.View$PerformClick.run(View.java:20101) 15 at android.os.Handler.handleCallback(Handler.java:810) 16 at android.os.Handler.dispatchMessage(Handler.java:99) 17 at android.os.Looper.loop(Looper.java:189) 18 at android.app.ActivityThread.main(ActivityThread.java:5529) 19 at java.lang.reflect.Method.invoke(Native Method) 20 at java.lang.reflect.Method.invoke(Method.java:372) 21 at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:956) 22 at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:751) 
  • But can be more detail text mistakes - plesser
  • Post your decision as a response. The question is only for the actual problem, not its solution. - pavlofff
  • I noticed one feature here: if you take the adapter from my own answer, but the dimension of the array of strings (which is used to store the displayed data) to do more than these same data - the same error drops. I watched SparseArray in the debugger, there were 13 keys at once (I have 3 lines occupied), although size () shows 3 ... We can do it here ... - Necro The Human

1 answer 1

In general, it did not work out for me to defeat this bug. I walked around with a crutch: I created an array of strings, scored the displayed data there, and in the original SparseArray I began to store the id from the database and the position number corresponding to the saved string.

Adapter is now used:

  ArrayAdapter<String> adapter = new ArrayAdapter<String>(ask_phone.this,android.R.layout.simple_spinner_item,tmpCities); adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); Spinner spinner = (Spinner) findViewById(R.id.spinner); spinner.setAdapter(adapter); spinner.setPrompt("Список городов"); spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { @Override public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { cityId = mCities.keyAt(position); Log.d(LOG_TAG,"city id = "+cityId); } @Override public void onNothingSelected(AdapterView<?> parent) { } });