Nullpointer при использовании пользовательского адаптера в меню списка действий (с совместимостью -7)

Я столкнулся с исключением Nullpointer при использовании последней версии lib (а именно v18 of compat-lib , выпущенной с версией 4.3 Android) и используя режим меню навигации списка на панели действий. Ошибка возникает в версии 2.3.3 версии Android. Я считаю, что это потому, что в этой версии (и в других версиях) весь код исполняемого файла используется в коде compat-lib.

Когда я нажимаю на меню списка (на панели действий), мое приложение падает, и я получаю следующую ошибку в logcat:

07-30 18:17:59.296: E/AndroidRuntime(14701): FATAL EXCEPTION: main 07-30 18:17:59.296: E/AndroidRuntime(14701): java.lang.NullPointerException 07-30 18:17:59.296: E/AndroidRuntime(14701): at android.support.v7.internal.widget.ListPopupWindow$DropDownListView.measureHeightOfChildrenCompat(ListPopupWindow.java:1317) 07-30 18:17:59.296: E/AndroidRuntime(14701): at android.support.v7.internal.widget.ListPopupWindow.buildDropDown(ListPopupWindow.java:1062) 07-30 18:17:59.296: E/AndroidRuntime(14701): at android.support.v7.internal.widget.ListPopupWindow.show(ListPopupWindow.java:514) 07-30 18:17:59.296: E/AndroidRuntime(14701): at android.support.v7.internal.widget.SpinnerICS$DropdownPopup.show(SpinnerICS.java:758) 07-30 18:17:59.296: E/AndroidRuntime(14701): at android.support.v7.internal.widget.SpinnerICS.performClick(SpinnerICS.java:443) 07-30 18:17:59.296: E/AndroidRuntime(14701): at android.view.View$PerformClick.run(View.java:9109) 07-30 18:17:59.296: E/AndroidRuntime(14701): at android.os.Handler.handleCallback(Handler.java:587) 07-30 18:17:59.296: E/AndroidRuntime(14701): at android.os.Handler.dispatchMessage(Handler.java:92) 07-30 18:17:59.296: E/AndroidRuntime(14701): at android.os.Looper.loop(Looper.java:130) 07-30 18:17:59.296: E/AndroidRuntime(14701): at android.app.ActivityThread.main(ActivityThread.java:3683) 07-30 18:17:59.296: E/AndroidRuntime(14701): at java.lang.reflect.Method.invokeNative(Native Method) 07-30 18:17:59.296: E/AndroidRuntime(14701): at java.lang.reflect.Method.invoke(Method.java:507) 07-30 18:17:59.296: E/AndroidRuntime(14701): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:895) 07-30 18:17:59.296: E/AndroidRuntime(14701): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:653) 07-30 18:17:59.296: E/AndroidRuntime(14701): at dalvik.system.NativeStart.main(Native Method) 

Вот xml выпадающей ячейки (называется item_menu_dropdown_celula.xml):

 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:background="@drawable/spinner_subitem_background_ab_boadicatema" android:gravity="center" android:minHeight="?android:attr/listPreferredItemHeight" android:orientation="horizontal" > <ImageView android:id="@+id/icone" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="10dip" android:scaleType="fitCenter" /> <TextView android:id="@+id/texto" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_marginLeft="5dip" android:gravity="left|center_vertical" android:shadowColor="@android:color/black" android:shadowDx="0" android:shadowDy="1" android:shadowRadius="0.1" android:textAppearance="?android:attr/textAppearanceMedium" android:textColor="@android:color/white" android:textStyle="bold" /> </LinearLayout> 

И вот код адаптера счетчика:

 public class SpinnerListMenu implements SpinnerAdapter{ private List<ItemMenu> itens; private LayoutInflater inflater; public SpinnerListMenu(Context context, List<ItemMenu> listaItens) { this.itens = listaItens; this.inflater = (LayoutInflater) context .getSystemService(Context.LAYOUT_INFLATER_SERVICE); } @Override public int getCount() { return itens.size(); } @Override public ItemMenu getItem(int arg0) { return itens.get(arg0); } @Override public long getItemId(int position) { return 0; } @Override public int getItemViewType(int position) { return 0; } @Override public View getView(int position, View convertView, ViewGroup parent) { final ViewHolder holder; View row = convertView; if ((row == null) || (row.getTag() == null)) { row = inflater.inflate(R.layout.item_menu_celula, null); holder = new ViewHolder(row); row.setTag(holder); } else { holder = (ViewHolder) row.getTag(); } ItemMenu atual = getItem(position); holder.texto.setText(atual.getNomeDaArea()); holder.icone.setBackgroundResource(atual.getIconeMenuFechadoResource()); holder.icone.setScaleType(ScaleType.FIT_CENTER); return row; } private class ViewHolder { ImageView icone; TextView texto; public ViewHolder(View base) { icone = (ImageView) base.findViewById(R.id.icone); texto = (TextView) base.findViewById(R.id.texto); } } @Override public int getViewTypeCount() { return 0; } @Override public boolean hasStableIds() { return false; } @Override public boolean isEmpty() { return itens.size() == 0; } @Override public void registerDataSetObserver(DataSetObserver observer) { } @Override public void unregisterDataSetObserver(DataSetObserver observer) { } @Override public View getDropDownView(int position, View convertView, ViewGroup parent) { final ViewHolderDD holder; View row = convertView; if ((row == null) || (row.getTag() == null)) { row = inflater.inflate(R.layout.item_menu_dropdown_celula, null); holder = new ViewHolderDD(row); row.setTag(holder); } else { holder = (ViewHolderDD) row.getTag(); } ItemMenu atual = getItem(position); holder.texto.setText(atual.getNomeDaArea()); holder.icone.setBackgroundResource(atual.getIconeMenuAbertoResource()); return row; } private class ViewHolderDD { ImageView icone; TextView texto; public ViewHolderDD(View base) { icone = (ImageView) base.findViewById(R.id.icone); texto = (TextView) base.findViewById(R.id.texto); } } } 

В этой операции я установил меню и его адаптер с кодом:

 //This class correctly extends ActionBarActivity //here we area inside onCreate method getSupportActionBar().setNavigationMode(ActionBar.NAVIGATION_MODE_LIST); ArrayList<ItemMenu> itens = = new ArrayList<ItemMenu>(); //Here I add 2 itens in the arraylist //... getSupportActionBar().setListNavigationCallbacks( new SpinnerListMenu(this, itens), this); 

Дополнительная информация. Когда в моей работе я использую адаптер массива, например …

 SpinnerAdapter mSpinnerAdapter = ArrayAdapter.createFromResource(this, R.array.action_list, android.R.layout.simple_spinner_dropdown_item); 

Он работает, ошибка не возникает.

Кто-нибудь знает, что вызывает эту ошибку? (Или даже если это ошибка из самой совместимости lib (это, я думаю, после просмотра трассировки стека и изменения множества свойств моего xml))

Solutions Collecting From Web of "Nullpointer при использовании пользовательского адаптера в меню списка действий (с совместимостью -7)"

После публикации этой проблемы в трекере по проблеме Android я получил гораздо лучший ответ (чем мой старый) от участника проекта Android. Правильный способ исправить это – заменить строку

 row = inflater.inflate(R.layout.item_menu_dropdown_celula, null); 

По линии

 row = inflater.inflate(R.layout.item_menu_dropdown_celula, parent, false);