Создание держателя ListView для MainActivity

У меня есть список, работающий для отображения его в MainActivity, и макет настроен на наличие 3 свойств TextView нового объекта Person.

Мой предыдущий код работал, но прокрутка была медленной, поэтому я решил использовать шаблон Холдера для оптимизации. Однако при попытке реализовать это я получаю NullPointerException в строках TextView personID=(TextView) view.findViewById(R.id.person_field1)

listView настроен на ListView в MainActivity, и мне нужно, чтобы объекты человека отображались в этом представлении в MainActivity.

Класс MainActivity:

public void onButtonClick() 
{
   //put the persons objects on the listView within MainActivity
   listView.setAdapter(new personAdapter(MainActivity.this, R.layout.list_layout, 
                        personList));
}

class personAdapter extends ArrayAdapter<Person>
{
    private LayoutInflater layoutInflator;

    public personAdapter(Context context, int resource, List<Person> p) {
        super(context, resource, p);
        layoutInflator = LayoutInflater.from(context);
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View view = convertView;
        Holder holder = null;
        Person p = getItem(position);

        if (view == null) {
            layoutInflator.inflate(R.layout.list_layout, null);  

            //getting null pointer exceptions here
            TextView personID = (TextView) view.findViewById(R.id.person_field1);
            TextView personFName = (TextView) view.findViewById(R.id.person_field2);
            TextView personLName = (TextView) view.findViewById(R.id.person_field3);

            holder = new Holder(personID, personFName, personLName);

            view.setTag(holder);
        }
        else {
            holder = (Holder) view.getTag();
        }

        holder.stop.setText(person.getID());
        holder.location.setText(person.getFName());
        holder.time.setText(person.getLName()); 
        return view;
    }
}

static class Holder 
{
    public TextView id;
    public TextView FName;
    public TextView LName;

    public Holder(TextView id, TextView FName, TextView LName) {
        this.id = id;
        this.FName = FName;
        this.LName = LName;
    }
}

person user1281921    schedule 25.02.2015    source источник


Ответы (3)


потому что действительно есть ноль, обратите внимание на проверку view == null, а затем view никогда не инициализируется, попробуйте это

view = layoutInflator.inflate(R.layout.list_layout, null);  
person SorryForMyEnglish    schedule 25.02.2015

Просто добавьте ссылку на свое представление:

view = layoutInflator.inflate(R.layout.list_layout, null);

person Stanislav Bodnar    schedule 25.02.2015

view имеет значение null, вы даже проверяете его:

if (view == null) { ...
}

Чего вам не хватает, так это назначить завышенный макет view.

view = layoutInflator.inflate(R.layout.list_layout, null);
person ci_    schedule 25.02.2015