Настройка адаптера ListView: исключение нулевого указателя

Я пытаюсь установить содержимое ListView в массив TextViews.

С тем, что у меня есть в настоящее время, я получаю исключение нулевого указателя, хотя я думаю, что буду делать то, что предлагается здесь: как мне динамически добавлять элементы в listview в android

Вот что у меня есть на данный момент:

ListView lvSuggestions = (ListView)findViewById(R.id.lvSuggestions);

ArrayAdapter<TextView> arrayAdapter =  new ArrayAdapter<TextView>(this, android.R.layout.simple_list_item_1);
lvSuggestions.setAdapter(arrayAdapter);

Но я получаю исключение, когда он устанавливает адаптер.

Я попытался заполнить ArrayList TextViews, а затем создать адаптер с полным ArrayList, но я получаю то же исключение Null Pointer Exception, когда устанавливаю Adaptor.

Спасибо за любую помощь


person Tom Bowen    schedule 15.04.2012    source источник


Ответы (4)


Обратитесь к этим ссылкам для использования пользовательских адаптеров.

LINK1

LINK2

LINK3

LINK4

LINK5

LINK6

person Shankar Agarwal    schedule 15.04.2012
comment
Спасибо, я посмотрю на это. - person Tom Bowen; 15.04.2012

ArrayAdapter<TextView> arrayAdapter =  new ArrayAdapter<TextView>(this, android.R.layout.simple_list_item_1);

измените строку выше на строку ниже

ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>(context, android.R.layout.simple_list_item_1);

и добавьте всю строку, которую вы хотите отобразить, в arrayAdapter, как показано ниже.

arrayAdapter.add("string1");
arrayAdapter.add("string2");
arrayAdapter.add("string3");//so on 
person Shankar Agarwal    schedule 15.04.2012
comment
Но я не хочу заполнять его строками. Могу ли я не заполнить его TextViews? - person Tom Bowen; 15.04.2012
comment
даже в текстовом виде вам нужно установить текст со строками - person Shankar Agarwal; 15.04.2012
comment
Да, я знаю, что мне нужно будет установить текст Textview со строками. Но я хочу, чтобы мой ListView содержал массив TextView, потому что я хочу иметь возможность устанавливать идентификаторы TextView. Можно ли заполнить ListView ArrayList типа TextView? - person Tom Bowen; 15.04.2012
comment
но как вы установите текст и идентификатор для arrayadapter и какой смысл устанавливать идентификаторы для просмотра текста в вашем случае - person Shankar Agarwal; 15.04.2012
comment
Что-то вроде следующего: TextView txtArtistName = new TextView(this); txtArtistName.setId(1); txtArtistName.setText (тест); arrayAdapter.add (txtArtistName); - person Tom Bowen; 15.04.2012
comment
опубликовал еще один ответ, пройдите по этим ссылкам. - person Shankar Agarwal; 15.04.2012
comment
@Tom: Ответ Агарвала - это правильный способ использования ArrayAdapter с android.R.layout.simple_list_item_1, который (во всех смыслах и целях) просто определяет TextView для каждого элемента списка. В этом случае нет необходимости иметь разные id для каждого TextView - если пользователь выбирает (щелкает) элемент представления списка, вы можете просто получить оттуда текст. - person Squonk; 15.04.2012
comment
Я хотел установить идентификатор, так как у меня есть скрытый текст, который я хотел бы получить при нажатии. Это уникальный ключ для отображаемого текста. И я хотел бы знать, какая клавиша была нажата. - person Tom Bowen; 16.04.2012

Этот

(ListView)findViewById(R.id.lvSuggestions);

может вернуть null, если findViewById возвращает null (элемент не найден) или возвращенный объект не имеет типа ListView.

Защитите его с помощью:

if (lvSuggestions != null) {
  ArrayAdapter<TextView> arrayAdapter = new ArrayAdapter<TextView>(this, 
      android.R.layout.simple_list_item_1);
  lvSuggestions.setAdapter(arrayAdapter);
}
person Attila    schedule 15.04.2012
comment
Хотя вы правы, это не та строка, которая возвращает исключение. Это: lvSuggestions.setAdapter(arrayAdapter); - person Tom Bowen; 15.04.2012
comment
да, lvSuggestions.setAdapter() вызовет исключение NullPointerException, если lvSuggestions равно null - person Attila; 15.04.2012
comment
Я понимаю. Но это не нулевое значение. Я вижу это в отладке. - person Tom Bowen; 15.04.2012
comment
Тогда идите с ответом Агарваля (я недостаточно хорошо разбираюсь во внутренней работе андроида :)), но я предлагаю вам поставить защиту, если она все равно есть: может избавить вас от проблем в будущем - person Attila; 15.04.2012

Возможно, вы поставили setContentView после setAdapter.

должно быть так:

установитьКонтентВиев(ххх);

//....

установить адаптер (ххх)

Надеюсь, это поможет!

person Lạng Hoàng    schedule 24.08.2013