android - Spinner: NullPointerException en ArrayAdapter.createViewFromResource
android-arrayadapter (4)
Creo algunos Spinners por código como este:
if (dyn_list_id[i]==null){
String[] form_ids = db.getEntireColumn(list_table_name[i], "form_label_id");
String[] spinnerArray = new String[form_ids.length];
for (int k=0;k<form_ids.length;k++){
spinnerArray[k] = db.getFromLanguageTable(language_short_name, list_table_name[i], form_ids[k]);
System.out.println("Spinner Array "+spinnerArray[k]);
}
product_spinner[i] = new Spinner(viewToLoad.getContext()); //First Spinner
product_spinner[i].setLayoutParams(lp_spinner);
product_spinner[i].setBackgroundResource(R.drawable.spinner_selector);
ArrayAdapter spinnerArrayAdapter = new ArrayAdapter(viewToLoad.getContext(), com.Orange.R.layout.my_spinner_textview, spinnerArray);
spinnerArrayAdapter.setDropDownViewResource(R.layout.multiline_spinner_dropdown_item);
product_spinner[i].setAdapter(spinnerArrayAdapter);
this.SpinnerFields.add(product_spinner[i]);
linear_layout[i].addView(product_spinner[i]);
tablerow_product[i].addView(linear_layout[i]);
Themes_TableLayout.addView(tablerow_product[i],new TableLayout.LayoutParams(TableRow.LayoutParams.FILL_PARENT,
TableRow.LayoutParams.WRAP_CONTENT));
}
else {
String[] spinnerA = new String[item_visible];
int cont=0;
for (int p=0;p<status_itemList.length;p++){
if (status_itemList[p].trim().equals("1")){
spinnerA[cont]=db.getFromLanguageTable(language_short_name, "pr_dyn_list_option", form_label_id_itemList[p]);
System.out.println("Spinner dinamic array "+spinnerA[cont]);
cont++;
}
}
product_spinner[i] = new Spinner(viewToLoad.getContext()); //second Spinner
product_spinner[i].setLayoutParams(lp_spinner);
product_spinner[i].setBackgroundResource(R.drawable.spinner_selector);
ArrayAdapter spinnerAdapter = new ArrayAdapter(viewToLoad.getContext(), com.Orange.R.layout.my_spinner_textview, spinnerA);
spinnerAdapter.setDropDownViewResource(com.Orange.R.layout.multiline_spinner_dropdown_item); product_spinner[i].setAdapter(spinnerAdapter);
this.SpinnerFields.add(product_spinner[i]);
linear_layout[i].addView(product_spinner[i]);
tablerow_product[i].addView(linear_layout[i]);
Themes_TableLayout.addView(tablerow_product[i],new TableLayout.LayoutParams(TableRow.LayoutParams.FILL_PARENT,
TableRow.LayoutParams.WRAP_CONTENT));
}
Parece estar bien en la pantalla, pero cuando hago clic en él obtengo este error:
15:53:22.040 8716 com.Orange ERROR AndroidRuntime java.lang.NullPointerException
15:53:22.040 8716 com.Orange ERROR AndroidRuntime at android.widget.ArrayAdapter.createViewFromResource(ArrayAdapter.java:355)
15:53:22.040 8716 com.Orange ERROR AndroidRuntime at android.widget.ArrayAdapter.getDropDownView(ArrayAdapter.java:376)
15:53:22.040 8716 com.Orange ERROR AndroidRuntime at android.widget.Spinner$DropDownAdapter.getDropDownView(Spinner.java:329)
15:53:22.040 8716 com.Orange ERROR AndroidRuntime at android.widget.Spinner$DropDownAdapter.getView(Spinner.java:325)
15:53:22.040 8716 com.Orange ERROR AndroidRuntime at android.widget.AbsListView.obtainView(AbsListView.java:1294)
15:53:22.040 8716 com.Orange ERROR AndroidRuntime at android.widget.ListView.measureHeightOfChildren(ListView.java:1198)
15:53:22.040 8716 com.Orange ERROR AndroidRuntime at android.widget.ListView.onMeasure(ListView.java:1109)
15:53:22.040 8716 com.Orange ERROR AndroidRuntime at android.view.View.measure(View.java:8171)
15:53:22.040 8716 com.Orange ERROR AndroidRuntime at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3132)
15:53:22.040 8716 com.Orange ERROR AndroidRuntime at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1012)
15:53:22.040 8716 com.Orange ERROR AndroidRuntime at android.widget.LinearLayout.measureVertical(LinearLayout.java:381)
15:53:22.040 8716 com.Orange ERROR AndroidRuntime at android.widget.LinearLayout.onMeasure(LinearLayout.java:304)
15:53:22.040 8716 com.Orange ERROR AndroidRuntime at com.android.internal.widget.WeightedLinearLayout.onMeasure(WeightedLinearLayout.java:60)
15:53:22.040 8716 com.Orange ERROR AndroidRuntime at android.widget.FrameLayout.onMeasure(FrameLayout.java:245)
15:53:22.040 8716 com.Orange ERROR AndroidRuntime at android.view.ViewRoot.performTraversals(ViewRoot.java:801)
15:53:22.040 8716 com.Orange ERROR AndroidRuntime at android.view.ViewRoot.handleMessage(ViewRoot.java:1727)
15:53:22.040 8716 com.Orange ERROR AndroidRuntime at android.os.Handler.dispatchMessage(Handler.java:99)
15:53:22.040 8716 com.Orange ERROR AndroidRuntime at android.os.Looper.loop(Looper.java:123)
15:53:22.040 8716 com.Orange ERROR AndroidRuntime at android.app.ActivityThread.main(ActivityThread.java:4627)
15:53:22.040 8716 com.Orange ERROR AndroidRuntime at java.lang.reflect.Method.invokeNative(Native Method)
15:53:22.040 8716 com.Orange ERROR AndroidRuntime at java.lang.reflect.Method.invoke(Method.java:521)
15:53:22.040 8716 com.Orange ERROR AndroidRuntime at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
15:53:22.040 8716 com.Orange ERROR AndroidRuntime at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
First Spinner añadido funciona bien, pero para el segundo Spinner obtengo este error. No tengo idea de por qué obtengo un nullpointer en AdapterArray.createViewFromResources porque no uso este método. ¿Dónde está mi error?
Primero spinner que usas:
spinnerArrayAdapter.setDropDownViewResource(R.layout.multiline_spinner_dropdown_item);
segundo que usas:
spinnerAdapter.setDropDownViewResource(com.Orange.R.layout.multiline_spinner_dropdown_item);
¿Estás seguro de que ambos son iguales / funcionan correctamente?
Tiene valores null
en la lista / matriz de datos que suministra al adaptador. ArrayAdapter
llamará a ArrayAdapter
en estos datos para cada fila y si es null
lanzará una NullPointerException
.
Asegúrese de no tener valores null
en spinnerA
(creo que son los datos para el segundo Spinner
(! ??)).
Mi problema fue que el diseño de elementos personalizados y el diseño de elementos desplegables no usaban el mismo Id para la vista de texto principal; básicamente porque quería crear un artículo personalizado, pero mantener el elemento desplegable predeterminado.
La creación de un elemento desplegable personalizado con el mismo ID de vista de texto resolvió el problema.
Hola, lo he hecho utilizando esta función, verifique valores nulos, no los agregue a su lista. Esta función devolverá una matriz de lista de todos los valores de una columna especificada de la tabla y NO los valores nulos.
public List<String> getList()
{
List<String> list = new ArrayList<String>();
Cursor cursor = sqlDb.query("tablename", new String[] {
"someColumnName1" }, null, null, null, null, null);
int i=0;
for (cursor.moveToPosition(i); !cursor.isAfterLast(); cursor.moveToNext()) {
if(cursor.getString(i) != null) //in loop check for Null Values, add only Not null values
{
list.add(cursor.getString(i));
}
}
return shopList;
}
Complete el spinner del método anterior de esta manera:
private void populateSpinnerList()
{
List<String> list = getList();
ArrayAdapter<String> dataAdapter = new ArrayAdapter<String>(context,
R.layout.some_layout, R.id.some_textview_in_layout, list);
if (!list.equals(""))
spinner.setAdapter(dataAdapter);
}
Funciona para mí como un encanto.