Android: Выдает ошибку для отображения ListView кастомного
Выдает ошибку для отображения ListView кастомного...
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.usingbymyself.recycler, PID: 19399
java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.ImageView.setImageResource(int)' on a null object reference
at com.usingbymyself.recycler.MenuElementAdapter.getView(MenuElementAdapter.java:33)
at android.widget.AbsListView.obtainView(AbsListView.java:2387)
at android.widget.ListView.makeAndAddView(ListView.java:1970)
at android.widget.ListView.fillDown(ListView.java:704)
at android.widget.ListView.fillFromTop(ListView.java:765)
at android.widget.ListView.layoutChildren(ListView.java:1744)
at android.widget.AbsListView.onLayout(AbsListView.java:2176)
at android.view.View.layout(View.java:17666)
at android.view.ViewGroup.layout(ViewGroup.java:5577)
at androidx.constraintlayout.widget.ConstraintLayout.onLayout(ConstraintLayout.java:1915)
at android.view.View.layout(View.java:17666)
at android.view.ViewGroup.layout(ViewGroup.java:5577)
at android.widget.FrameLayout.layoutChildren(FrameLayout.java:323)
at android.widget.FrameLayout.onLayout(FrameLayout.java:261)
at android.view.View.layout(View.java:17666)
at android.view.ViewGroup.layout(ViewGroup.java:5577)
at androidx.appcompat.widget.ActionBarOverlayLayout.onLayout(ActionBarOverlayLayout.java:446)
at android.view.View.layout(View.java:17666)
at android.view.ViewGroup.layout(ViewGroup.java:5577)
at android.widget.FrameLayout.layoutChildren(FrameLayout.java:323)
at android.widget.FrameLayout.onLayout(FrameLayout.java:261)
at android.view.View.layout(View.java:17666)
at android.view.ViewGroup.layout(ViewGroup.java:5577)
at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1741)
at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1585)
at android.widget.LinearLayout.onLayout(LinearLayout.java:1494)
at android.view.View.layout(View.java:17666)
at android.view.ViewGroup.layout(ViewGroup.java:5577)
at android.widget.FrameLayout.layoutChildren(FrameLayout.java:323)
at android.widget.FrameLayout.onLayout(FrameLayout.java:261)
at com.android.internal.policy.DecorView.onLayout(DecorView.java:730)
at android.view.View.layout(View.java:17666)
at android.view.ViewGroup.layout(ViewGroup.java:5577)
at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:2390)
at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2112)
at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1298)
at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6437)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:876)
at android.view.Choreographer.doCallbacks(Choreographer.java:688)
at android.view.Choreographer.doFrame(Choreographer.java:623)
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:862)
at android.os.Handler.handleCallback(Handler.java:754)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:163)
at android.app.ActivityThread.main(ActivityThread.java:6238)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:933)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:823)
Вот класс адаптера:
public class MenuElementAdapter extends ArrayAdapter<MenuElement> {
private LayoutInflater inflater;
private int layout;
private ArrayList<MenuElement> menuElememtlist;
MenuElementAdapter(Context context, int resource, ArrayList<MenuElement> menuElementList) {
super(context, resource, menuElementList);
this.menuElememtlist = menuElementList;
this.layout = resource;
this.inflater = LayoutInflater.from(context);
}
public View getView(int position, View convertView, ViewGroup parent) {
View view=inflater.inflate(this.layout, parent, false);
ImageView iconImage = (ImageView)view.findViewById(R.id.imageView_iconMainMenu);
Button button = (Button)view.findViewById(R.id.button_menuTitle);
MenuElement menuElement=menuElememtlist.get(position);
iconImage.setImageResource(menuElement.getIconResource());
button.setText(menuElement.getElementName());
return view;
}
}
вот мэйн активити
public class MainActivity extends AppCompatActivity {
ArrayList<MenuElement> menuElements;
private ListView listViewMenu;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
listViewMenu = findViewById(R.id.list_menu);
menuElements = new ArrayList<>();
menuElements.add(new MenuElement(R.drawable.fif,"Ljslr"));
MenuElementAdapter adapter = new MenuElementAdapter(this, android.R.layout.simple_expandable_list_item_1, menuElements);
listViewMenu.setAdapter(adapter);
}
}
Ответы (1 шт):
Ресурс разметки
android.R.layout.simple_expandable_list_item_1
из дефолтных ресурсов андроид, который вы пытаетесь использовать в качестве разметки вашего айтема списка не содержит других виджетов, кроме TextView (то есть его нельзя использовать для отображения картинки) и абсолютно точно не содержит вашего собственного imageView_iconMainMenu, хотя бы потому, что в далеком 2008 году, когда писалась эта разметка, никто в гугл и подумать не мог, что в 2020 некий Ифенкиул захочет найти его там.
Вместо дефолтного ресурса андроид вам нужно сделать собственную разметку для айтема и затем указать именно ее вместо того, что у вас сейчас.