ListView listView1;
String [] Title = {"one","two","four","five"};
int[] imgid = {R.drawable.dela, R.drawable.gnev, R.drawable.psy};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_list);
listView1 = (ListView)findViewById(R.id.listview1);
CustomAdapter customAdapter = new CustomAdapter();
listView1.setAdapter(customAdapter);
}
class CustomAdapter extends BaseAdapter{
@Override
public int getCount() {
return imgid.length;
}
@Override
public Object getItem(int i) {
return null;
}
@Override
public long getItemId(int i) {
return 0;
}
@Override
public View getView(int i, View view, ViewGroup viewGroup) {
View view1 = getLayoutInflater().inflate( R.layout.title,null);
ImageView imageView2 = (ImageView)findViewById(R.id.imageView2);
TextView textView = (TextView)findViewById(R.id.textView1);
imageView2.setImageResource(imgid[i]);
textView.setText(Title[i]);
return view1;
}
}
}
-
В логах пишет следующее - E/AndroidRuntime: FATAL EXCEPTION: main Process: com.example.azot2, PID: 7738 java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.ImageView.setImageResource(int)' on a null object reference at com.example.azot2.ListActivity$CustomAdapter.getView(ListActivity.java:61) – Anton Feb 14 '18 at 16:57
-
Возможный дубликат вопроса: Что такое Null Pointer Exception и как его исправить? – Sergey Gornostaev Feb 14 '18 at 16:58
1 Answers
Ваш адаптер определён в классе активити, засим строка
ImageView imageView2 = (ImageView)findViewById(R.id.imageView2);
расшифровывается компилятором в
ImageView imageView2 = (ImageView)ActivityClassName.this.findViewById(R.id.imageView2);
т.е. вы ищите ImageView в разметке активити, а не разметке элемента списка. Так происходит потому, что компилятор видит метод findViewById и сначала пытается его найти в классе адаптера. Но у него такого метода нет. Засим компилятор ищет в обрамляющем классе этот метод. Находит его, вызывает на экземпляре этого класса, но вьюху там не находит, она становится null, после чего вы и получаете NPE. Вы бы избежали этого, если бы описали ваш адаптер в отдельном классе, как и следует делать, если вы пишите реальное приложение, а не разбираете пример.
Вам надо искать вашу вьюху в разметке элемента списка, вызывая метод на ней так:
ImageView imageView2 = (ImageView) view1.findViewById(R.id.imageView2);
Также, советую переходить на RecyclerView - современную версию ListView.
- 69,813
-
-
ViewHolder всего лишь кэширует ссылки на виджеты (хранит значение, полученное методом
findViewById()) и никаким образом не решает проблемы мешанины в элементах списка при скролле – pavlofff Feb 15 '18 at 00:54 -