0
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;
        }
    }
}
katso
  • 10,991
Anton
  • 97

1 Answers1

1

Ваш адаптер определён в классе активити, засим строка

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.

  • Спасибо вам за помощь все работает – Anton Feb 14 '18 at 18:59
  • ViewHolder всего лишь кэширует ссылки на виджеты (хранит значение, полученное методом findViewById()) и никаким образом не решает проблемы мешанины в элементах списка при скролле – pavlofff Feb 15 '18 at 00:54
  • @pavlofff, ну, в главном то я прав) Исправил) – ЮрийСПб Feb 15 '18 at 05:46