ArrayAdapter и ListView

У меня есть этот код, который должен получить listview и заполнить его адаптером массива:

public class news extends ListActivity {
public String[] titoli = new String[99];
public String[] descrizioni = new String[99];

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    new connection().execute();
    System.out.println("prova1");
}

public class connection extends AsyncTask {
    public Void doInBackground(Void... params) {
        System.out.println("prova2");
       //All static variables
        final String URL = "http://www.messedaglia.it/index.php/archivio-news?format=feed&type=rss";
       //XML node keys
        final String ITEM = "item";//parent node
        final String TITLE = "title";
        final String DESC = "description";
        Element e = null;
        ArrayList> menuItems = new ArrayList>();

        XMLParser parser = new XMLParser();
        String xml = parser.getXmlFromUrl(URL);//getting XML
        Document doc = parser.getDomElement(xml);//getting DOM element
        NodeList nl = doc.getElementsByTagName(ITEM);

       //looping through all item nodes 
        for (int i = 0; i < nl.getLength(); i++) {
           //creating new HashMap
            HashMap map = new HashMap();
            e = (Element) nl.item(i);
           //adding each child node to HashMap key => value
            map.put(TITLE, parser.getValue(e, TITLE));
            map.put(DESC, parser.getValue(e, DESC));

           //adding HashList to ArrayList
            menuItems.add(map);
        }
        System.out.println("prova3");
        for (int c = 0; c < nl.getLength(); c++) {
            e = (Element) nl.item(c);
            titoli[c] = parser.getValue(e, TITLE);//name child value
            descrizioni[c] = parser.getValue(e, DESC);
        }
        return null;
    }

    public void onPostExecute() {
        System.out.println("prova4");
        ArrayAdapter adapter = new ArrayAdapter(news.this,
                android.R.layout.simple_list_item_1, titoli);
        System.out.println("prova5");
        ListView listView = (ListView) news.this
                .findViewById(android.R.id.list);
        listView.setAdapter(adapter);
    }
     }
 }

в журнале отображается Исключение Null Pointer здесь (строка 33 моего кода):

listView.setAdapter(adapter);

ЖУРНАЛ:

02-07 13:38:36.020: E/AndroidRuntime(13803): FATAL EXCEPTION: main
02-07 13:38:36.020: E/AndroidRuntime(13803): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.messedagliavr.messeapp/com.messedagliavr.messeapp.news}: java.lang.NullPointerException
02-07 13:38:36.020: E/AndroidRuntime(13803):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2100)
02-07 13:38:36.020: E/AndroidRuntime(13803):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2125)
02-07 13:38:36.020: E/AndroidRuntime(13803):    at android.app.ActivityThread.access$600(ActivityThread.java:140)
02-07 13:38:36.020: E/AndroidRuntime(13803):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1227)
02-07 13:38:36.020: E/AndroidRuntime(13803):    at android.os.Handler.dispatchMessage(Handler.java:99)
02-07 13:38:36.020: E/AndroidRuntime(13803):    at android.os.Looper.loop(Looper.java:137)
02-07 13:38:36.020: E/AndroidRuntime(13803):    at android.app.ActivityThread.main(ActivityThread.java:4898)
02-07 13:38:36.020: E/AndroidRuntime(13803):    at java.lang.reflect.Method.invokeNative(Native Method)
02-07 13:38:36.020: E/AndroidRuntime(13803):    at java.lang.reflect.Method.invoke(Method.java:511)
02-07 13:38:36.020: E/AndroidRuntime(13803):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1006)
02-07 13:38:36.020: E/AndroidRuntime(13803):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:773)
02-07 13:38:36.020: E/AndroidRuntime(13803):    at dalvik.system.NativeStart.main(Native Method)
02-07 13:38:36.020: E/AndroidRuntime(13803): Caused by: java.lang.NullPointerException
02-07 13:38:36.020: E/AndroidRuntime(13803):    at com.messedagliavr.messeapp.news.onCreate(news.java:33)
02-07 13:38:36.020: E/AndroidRuntime(13803):    at android.app.Activity.performCreate(Activity.java:5206)
02-07 13:38:36.020: E/AndroidRuntime(13803):    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1083)
02-07 13:38:36.020: E/AndroidRuntime(13803):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2064)
02-07 13:38:36.020: E/AndroidRuntime(13803):    ... 11 more

Большинство из вас говорит добавить setContentView (). Я удалил его, потому что добавив его, я получаю эту ошибку:

error: java.lang.RuntimeException: Your content must have a ListView whose id attribute is 'android.R.id.list' 
0
nl ja de
Добавьте «setContentView» сразу после вызова функции «super.onCreate»
добавлено автор Ameer Moaaviah, источник
Где вы используете функцию setContentView ()? Вы пытаетесь найти представление перед вызовом метода setContentView ().
добавлено автор Hardik Trivedi, источник
работает ли работа с findViewById? Кажется, что переменная listView имеет значение null.
добавлено автор Piotr, источник
@Francesco Ambrosini Простой пример с ListView - ArrayAdapter . Просто попробуйте следовать этому. Вот ссылка .
добавлено автор user744881, источник
Я переместил setCOntentView() перед вызовом новостей класса. Я делаю это, потому что, если я не получаю эту ошибку: java.lang.RuntimeException: ваш контент должен иметь ListView с атрибутом id 'android.R.id.list'
добавлено автор Francesco Ambrosini, источник

3 ответы

Вам не хватает основного макета

     public void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
     setContentView(R.layout.main);    <----------------here
     new connection().execute();
     ArrayAdapter adapter = new ArrayAdapter(this,
        android.R.layout.simple_list_item_1, titoli);
ListView listView = (ListView) findViewById(R.id.list);
listView.setAdapter(adapter);
}
2
добавлено
Я переместил setCOntentView() перед вызовом новостей класса. Я делаю это, потому что, если я не получаю эту ошибку: java.lang.RuntimeException: ваш контент должен иметь ListView с атрибутом id 'android.R.id.list'
добавлено автор Francesco Ambrosini, источник

как в журнале:

NullPointerException 02-07 13: 38: 36.020: E/AndroidRuntime (13803):
  at com.messedagliavr.messeapp.news.onCreate (news.java:33)

потому что массив titoli пуст. вы используете AsyncTask для получения элементов в массиве titoli , а затем просто переместите код адаптера onPostExecute

и использовать

ListView listView = (ListView) findViewById(android.R.id.list);

вместо

ListView listView = (ListView) findViewById(R.id.list);

для получения ссылки ListView и должен объявить идентификатор ListView как android: id = "@ android: id/list" в макете xml, если вы используете

2
добавлено
@ AudriusMeškauskas в случае, когда u расширяют ListActivity, тогда нет необходимости иметь макет для ListActivity и не нужно использовать setContentView (R.layout.main); если вы не добавляете свой макет
добавлено автор ρяσѕρєя K, источник
@FrancescoAmbrosini: используйте этот код для добавления элементов, используя ArrayList в Listview
добавлено автор ρяσѕρєя K, источник
@FrancescoAmbrosini: и лучший способ - просто разместить свой код AsyncTask с вопросом
добавлено автор ρяσѕρєя K, источник
@FrancescoAmbrosini: просто проверьте, что массив не пуст, и лучший способ - использовать ArrayList вместо Array и вернуть его из метода doInBackground, а затем использовать его внутри метода onPostExecute
добавлено автор ρяσѕρєя K, источник
@ AudriusMeškauskas: может ли сказать мне 1. , если OP добавляет элементы в массив titoli внутри AsyncTask тогда?, 2. , когда u расширяют ListActivity, необходимо иметь макет для Activity ? 3. может OP получить ссылку на ListView с помощью findViewById (R.id.list), если класс, расширяющий ListActivity
добавлено автор ρяσѕρєя K, источник
@FrancescoAmbrosini: вот так: public void onPostExecute() {ArrayAdapter adapter = new ArrayAdapter (news.this, android.R.layout.simple_list_ & zwnj; item_1, titoli); ListView listView = (ListView) news.this.findViewById (android.R.id.list); listView.setAdapter (адаптер); }
добавлено автор ρяσѕρєя K, источник
@ AudriusMeškauskas: означает, что u downvote мой ответ может я знать почему?
добавлено автор ρяσѕρєя K, источник
проголосовать
добавлено автор ρяσѕρєя K, источник
Как переменная titioli может быть нулевой, если она инициализируется новой строкой [99], прежде чем выполняется даже конструктор?
добавлено автор h22, источник
Теперь это исправлено, поэтому я удаляю голосование.
добавлено автор h22, источник
Но трассировка стека начинается с строки 33 в приведенном выше коде. Единственный способ, которым NPE может быть выбрано именно из этой строки, - это listView - null. Однако с массивом нулей в качестве данных для списка выполнение, вероятно, не будет работать намного дальше.
добавлено автор h22, источник
что-то вроде этого ?: public void onPostExecute() {ArrayAdapter adapter = new ArrayAdapter (это, android.R.layout.simple_list_item_ & zwnj; 1, titoli); ListView listView = (ListView) findViewById (android.R.id.list); listView.setAdapter (адаптер);}
добавлено автор Francesco Ambrosini, источник
спасибо, что приложение больше не разбивается, но все равно не работает нормально: он показывает только белый экран.
добавлено автор Francesco Ambrosini, источник
Я отправляю asynctasck. Можете ли вы показать мне, как использовать ArrayList вместо Array? я не могу этого сделать ..
добавлено автор Francesco Ambrosini, источник
он работал, но мне пришлось добавить макет перед объявлением ListView. Мне нравится это сообщество. Спасибо вам и всем спасибо.
добавлено автор Francesco Ambrosini, источник

Это связано с тем, что макет не установлен на вашем компоненте. Сначала вам нужно вызвать setContentView (R.layout.my_great_layout) , только тогда имеет смысл вызвать findViewById .

Убедитесь, что в вашем макете есть ListView с идентификатором android.R.id.list :

  
1
добавлено
@ AudriusMeškauskas: им все еще не ясно, почему setContentView необходим, если OP не использует настраиваемый макет для Activity при расширении ListActivity
добавлено автор ρяσѕρєя K, источник
Не только использует пользовательский макет, но и, похоже, жалуется, я бы сказал, что в этом макете что-то не хватает.
добавлено автор h22, источник
Это была плохая идея. Вы просто должны иметь компонент ListView с этим идентификатором в вашем XML, см. Отредактированный ответ выше.
добавлено автор h22, источник
Я переместил setCOntentView() перед вызовом новостей класса. Я делаю это, потому что, если я не получаю эту ошибку: java.lang.RuntimeException: ваш контент должен иметь ListView с атрибутом id 'android.R.id.list'
добавлено автор Francesco Ambrosini, источник
Mobile Dev Jobs — вакансии и аналитика
Mobile Dev Jobs — вакансии и аналитика
6 187 участник(ов)

Публикуем вакансии и запросы на поиск работы по направлению iOS, Android, Xamarin и т.д. ВАЖНО: Правила публикации и правила канала: Ссылка – https://telegra.ph/Pravila-oformleniya-vakansij-i-rezyume-11-09-2

Android Developers
Android Developers
4 476 участник(ов)

Общаемся на темы, посвященным Android-разработке, SDK, Kotlin, Realm и т.д.

Android Architecture
Android Architecture
2 186 участник(ов)

Русскоязычный чат по архитектуре в андроид приложениях. Подробнее: http://telegra.ph/Android-Architecture-12-24

rus-speaking/android
rus-speaking/android
1 705 участник(ов)

Основной чат по Android разработке (вопрос-ответ). ПРАВИЛА: bit.ly/andr-rules. NEWS: bit.ly/AnrdResId ЧАТЫ: Основной: bit.ly/andr-main IDE, сборка, Git, сервисы: bit.ly/andr-tools Оффтоп: bit.ly/andr-offtop Конференции, события: bit.ly/andr-events Вакансии, найм: bit.ly/andr-job Архитектура: bit.ly/andr-patterns Rx: bit.ly/andr-rx Тестирование: bit.ly/andr-test Kotlin: bit.ly/andr-kotlin Хаmarin: bit.ly/andr-xamarin За мат, спам, агрессию, предложения о работе, оффтоп в этом канале - бан на сутки и более ☢☢☢

Android Dev Подкаст
Android Dev Подкаст
1 325 участник(ов)

Комната для обсуждения Android Dev подкаста apptractor.ru/AndroidDev/ Общее обсуждение Android: https://t.me/android_ru Остальные чаты про Android: http://t.me/devChats Наши новости https://t.me/androiddevpodcast_news

Android Guards
Android Guards
602 участник(ов)

Обсуждение любых вопросов касающихся безопасности Android. - Защита системы и приложений - Уязвимости и эксплойты - Вредоносное ПО - Копание в кишках системы и приложений (RE)

Android JOB
Android JOB
466 участник(ов)

Публикуем вакансии и запросы на поиск работы по направлению Android (full-time, part-time, remote и разовые подработки)

AndroidDev :: Разработка. It's Android time now!
AndroidDev :: Разработка. It's Android time now!
458 участник(ов)

It's Android time now! Чат разработчиков Android. Вакансии, резюме и информацию о митапах размещать можно. Публикацию скрытой и явной рекламы ваших каналов и сайтов после получения разрешения от @olegushakov

Aandroid Talks!
Aandroid Talks!
212 участник(ов)

Чат об общих вопросах по ОС Android. Чат для разработки под андроид - pro.android: https://t.me/joinchat/AAAAAEKIFKnmRT9cMebb9w

Android Rus
Android Rus
68 участник(ов)