Форум программистов, компьютерный форум, киберфорум
Программирование Android
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.89/9: Рейтинг темы: голосов - 9, средняя оценка - 4.89
0 / 0 / 0
Регистрация: 16.01.2017
Сообщений: 6

Ошибка при инициализации ListView в ViewPager

17.01.2017, 03:49. Показов 1833. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем доброго времени суток.
Столкнулся с проблемой, в простом примере создания ViewPager, все работает до тех пор, пока не инициализирую ListView.
Моих познаний не хватает, чтобы разобраться в чем ошибка, прошу помощи.

Для удобства прикладываю ссылку на проект

Без инициализации приложение запускается, а так выдает ошибку:
01-16 19:30:34.861 13563-13563/ru.lastgear.pageslider_v2 E/AndroidRuntime: FATAL EXCEPTION: main
Process: ru.lastgear.pageslider_v2, PID: 13563
java.lang.RuntimeException: Unable to start activity ComponentInfo{ru.lastgear.pageslider_v2/ru.lastgear.pageslider_v2.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.ListView.setAdapter(andro id.widget.ListAdapter)' on a null object reference

Заранее спасибо всем откликнувшимся!
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
17.01.2017, 03:49
Ответы с готовыми решениями:

Как победить подтормаживание при листании ViewPager со списками listview?
Как победить подтормаживание при листании ViewPager со списками listview? если быстро листать (ну или даже не очень быстро), то...

ViewPager и ListView
Вообще пытаюсь сделать пролистывающиеся редактируемые списки. Для этого использую ViewPager и ListView. Так как ViewPager использует...

Скроллинг ViewPager-а как у ListView
Как сделать скроллинг у ViewPager-а по несколько элементов сразу, в зависимости от скорости жеста, и доводить до просчитанной позиции? ...

10
2884 / 2296 / 769
Регистрация: 12.05.2014
Сообщений: 7,978
17.01.2017, 12:07
Цитата Сообщение от Koka77 Посмотреть сообщение
Для удобства
это тебе так кажется что это удобство

обычно сюда выкладывают код класса в котором ошибка
0
314 / 257 / 81
Регистрация: 31.10.2016
Сообщений: 619
17.01.2017, 12:15
Koka77, java.lang.NullPointerException самая простая ошибка из всех. Вы свой ListView не объявили. Его либо нет в разметке, либо он имеет не тот id, либо вы просто не сделали findViewById.
0
0 / 0 / 0
Регистрация: 16.01.2017
Сообщений: 6
17.01.2017, 15:03  [ТС]
Дело в том, что список в xml описывается не в activity_main.xml, а в отдельном файле разметки для первой страницы view_red.xml и я не понимаю как его правильно объявить.

код под спойлером:
Кликните здесь для просмотра всего текста

файл с описанием списка - view_red.xml:
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@android:color/holo_red_light"
    >
    <ListView
        android:id="@+id/listView"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" >
    </ListView>
 
</LinearLayout>
файл activity_main.xml:
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="ru.lastgear.pageslider_v2.MainActivity">
    <android.support.v4.view.ViewPager android:id="@+id/viewpager"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        />
</RelativeLayout>
Код класса:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
package ru.mypac.pageslider_v2;
 
import android.support.v4.view.ViewPager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.TableRow;
 
import static android.icu.lang.UCharacter.GraphemeClusterBreak.T;
import static ru.lastgear.pageslider_v2.R.id.listView;
 
public class MainActivity extends AppCompatActivity {
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 
        ViewPager viewPager = (ViewPager) findViewById(R.id.viewpager);
        viewPager.setAdapter(new CustomPagerAdapter(this));
 
 
        // Без добавления списка ниже, слайдер работает.
        // получаем экземпляр элемента ListView
        ListView listView = (ListView)findViewById(R.id.listView);
        // определяем массив типа String
        final String[] catNames = new String[] {
                "Рыжик", "Барсик", "Мурзик", "Мурка", "Васька", "Томасина", "Кристина", "Пушок", "Дымка", "Кузя","Китти", "Масяня", "Симба" };
        // используем адаптер данных
        ArrayAdapter<String> adapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, catNames);
        listView.setAdapter(adapter);
//////////////////////////
 
    }
}
Миниатюры
Ошибка при инициализации ListView в ViewPager  
0
314 / 257 / 81
Регистрация: 31.10.2016
Сообщений: 619
17.01.2017, 15:23
Koka77, возьмите пример с ViewPager или ViewPager with ListView. Повторите их код. Поймите, как он работает. Вносите изменения, какие вам нужно.
У вас была ошибка при постановке вопроса: не
Ошибка при инициализации ListView в ViewPager
А "Я не знаю, как сделать ViewPager"
0
0 / 0 / 0
Регистрация: 16.01.2017
Сообщений: 6
17.01.2017, 15:43  [ТС]
demixdn, спасибо за содержательный ответ.
ViewPager без инициализированного списка у меня работает.
В дальнейшем, прошу всех, кто желает потешить свое чсв, делать это за счет своих достижений , а не за счет промахов других. Если вам нечем помочь, не утруждайте себя ответом.
ЗЫ
Отдельное спасибо, всем откликнувшимся по существу вопроса!
0
314 / 257 / 81
Регистрация: 31.10.2016
Сообщений: 619
17.01.2017, 15:58
Лучший ответ Сообщение было отмечено Koka77 как решение

Решение

Koka77, ок, заглянул в код. вот вам ответ по существу: listview нужно вытягивать там, где создается или существует View, его содержащая. Вы их создаете в адаптере, значит она там и должна заполняться.
Java
1
2
3
4
5
6
7
...
ViewGroup layout = (ViewGroup) inflater.inflate(modelObject.getmLayoutResId(), collection, false);
if(modelObject == ModelObject.RED){
    ...//инициализация listview 
}
collection.addView(layout);
...
1
0 / 0 / 0
Регистрация: 16.01.2017
Сообщений: 6
17.01.2017, 18:55  [ТС]
demixdn, огромное спасибо! Это именно то, что мне было нужно!

под спойлером исправленный код инициализации (вдруг кому будет нужно):
Кликните здесь для просмотра всего текста
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
ViewGroup layout = (ViewGroup) inflater.inflate(modelObject.getmLayoutResId(), collection, false);
 
        if (modelObject == ModelObject.RED) {
           ListView listView = (ListView)layout.findViewById(R.id.listView);
            // определяем массив типа String
            final String[] catNames = new String[] {
                    "param1", "param2", "param3" };
            // используем адаптер данных
            ArrayAdapter<String> adapter = new ArrayAdapter<>(layout.getContext(), android.R.layout.simple_list_item_1, catNames);
            listView.setAdapter(adapter);
        }
 
        collection.addView(layout);
0
0 / 0 / 0
Регистрация: 16.01.2017
Сообщений: 6
18.01.2017, 21:42  [ТС]
В код выше попробовал добавить не список а таблицу,
Таблица инициализируется успешно, но может быть, кто-нибудь сможет объяснить почему не добавляются строки в таблицу.

Я понимаю, что вопросы у меня довольно примитивные, но честное слово, я уже больше двух суток бьюсь с этими проблемами. обшарил весь гугл, простых примеров с ViewPager хватает, но стоит попробовать сделать, шаг вправо/лево, и совершенно нет нужной информации.

Заранее спасибо всем откликнувшимся!

Код класса:
Кликните здесь для просмотра всего текста
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
package ru.lastgear.pageslider_v2;
 
import android.content.Context;
import android.support.annotation.StringRes;
import android.support.v4.view.PagerAdapter;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.TableLayout;
import android.widget.TableRow;
import android.widget.TextView;
 
import static android.R.color.holo_blue_light;
 
 
/**
 * Created by User on 16.01.2017.
 */
 
public class CustomPagerAdapter extends PagerAdapter {
 
    private Context mContext;
 
    public CustomPagerAdapter(Context context) {
        mContext = context;
    }
 
    @Override
    public Object instantiateItem(ViewGroup collection, int position) {
        ModelObject modelObject = ModelObject.values()[position];
        LayoutInflater inflater = LayoutInflater.from(mContext);
        ViewGroup layout = (ViewGroup) inflater.inflate(modelObject.getmLayoutResId(), collection, false);
 
        if (modelObject == ModelObject.RED) {
 
 
            //создаем заголовок для списка
            ListView.LayoutParams viewParams = new ListView.LayoutParams(ListView.LayoutParams.WRAP_CONTENT,
            ListView.LayoutParams.WRAP_CONTENT);
            TextView txtV = new TextView(layout.getContext());
            txtV.setText(R.string.text_balances_header);
            txtV.setLayoutParams(viewParams);
 
            //объявляем список
            ListView listView = (ListView)layout.findViewById(R.id.listView);
 
            //добавляем заголовок
            //listView.addHeaderView( txtV );  // способ создать кликабельный заголовок
            // метод позволяющий сделать заголовок не кликабельным 2й параметр тип  возвращаемый Adapter.getItem()
            listView.addHeaderView( txtV, null, false );
 
            // определяем массив типа String
            final String[] catNames = new String[] {
                    "Рыжик", "Барсик", "Мурзик", "Мурка", "Васька", "Томасина", "Кристина", "Пушок", "Дымка", "Кузя","Китти", "Масяня", "Симба" };
            // используем адаптер данных
            ArrayAdapter<String> adapter = new ArrayAdapter<>(layout.getContext(), android.R.layout.simple_list_item_1, catNames);
            listView.setAdapter(adapter);
//////////////////////////
 
 
        }else if (modelObject == ModelObject.BLUE){
 
            final String[] params = new String[] {
                    "par1", "par2", "par3", "par4", "par5", "par6", "par7", "par8", "par9", "par10","par11", "par12", "par13" , "par14" };
 
 
            ViewGroup.LayoutParams viewParams = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,ViewGroup.LayoutParams.WRAP_CONTENT);
            TableLayout.LayoutParams tableParams = new TableLayout.LayoutParams(TableLayout.LayoutParams.MATCH_PARENT, TableLayout.LayoutParams.WRAP_CONTENT);
 
            TableLayout table = (TableLayout) layout.findViewById(R.id.balances_table);
            for (String val : params ){
 
                TextView field = new TextView(layout.getContext());
                field.setText(val);
                field.setLayoutParams(viewParams);
 
                TableRow row = new TableRow(table.getContext());
                row.setLayoutParams(tableParams);
                row.addView(field);
                table.addView(row );
 
 
            }
            if(table.getParent()!=null)
                // без строчки ниже выдает ошибку The "specified child already has a parent. You must call removeView() on the child's parent first."
                // с строчкой ниже код компилируется, но строки не добавляются
                ((ViewGroup)table.getParent()).removeView(table);
            layout.addView(table);
 
        }
 
 
 
 
        collection.addView(layout);
        return layout;
    }
 
    @Override
    public void destroyItem(ViewGroup collection, int position, Object view) {
        collection.removeView((View) view);
    }
 
 
    @Override
    public int getCount() {
        return ModelObject.values().length;
    }
 
    @Override
    public boolean isViewFromObject(View view, Object object) {
        return view == object;
    }
 
    @Override
    public CharSequence getPageTitle(int position){
        ModelObject customPagerEnum = ModelObject.values()[position];
        return mContext.getString(customPagerEnum.getmTitleResId());
    }
}

Код только измененной части класса
Кликните здесь для просмотра всего текста
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
@Override
    public Object instantiateItem(ViewGroup collection, int position) {
        ModelObject modelObject = ModelObject.values()[position];
        LayoutInflater inflater = LayoutInflater.from(mContext);
        ViewGroup layout = (ViewGroup) inflater.inflate(modelObject.getmLayoutResId(), collection, false);
 
        if (modelObject == ModelObject.RED) {
// тут все как было...
else if (modelObject == ModelObject.BLUE){
 
            final String[] params = new String[] {
                    "par1", "par2", "par3", "par4", "par5", "par6", "par7", "par8", "par9", "par10","par11", "par12", "par13" , "par14" };
 
 
            ViewGroup.LayoutParams viewParams = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,ViewGroup.LayoutParams.WRAP_CONTENT);
            TableLayout.LayoutParams tableParams = new TableLayout.LayoutParams(TableLayout.LayoutParams.MATCH_PARENT, TableLayout.LayoutParams.WRAP_CONTENT);
 
            TableLayout table = (TableLayout) layout.findViewById(R.id.balances_table);
            for (String val : params ){
 
                TextView field = new TextView(layout.getContext());
                field.setText(val);
                field.setLayoutParams(viewParams);
 
                TableRow row = new TableRow(table.getContext());
                row.setLayoutParams(tableParams);
                row.addView(field);
                table.addView(row );
 
 
            }
            if(table.getParent()!=null)
                // без строчки ниже выдает ошибку The "specified child already has a parent. You must call removeView() on the child's parent first."
                // с строчкой ниже код компилируется, но строки не добавляются
                ((ViewGroup)table.getParent()).removeView(table);
            layout.addView(table);
 
        }

XML файл разметки
Кликните здесь для просмотра всего текста
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@android:color/holo_blue_light"
    >
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:text="first View"
        android:layout_gravity="center_horizontal"
        android:textSize="28sp"
        android:textColor="@android:color/black"
        android:textStyle="bold"
        android:layout_centerVertical="true"
        android:layout_centerHorizontal="true"
        android:id="@+id/testView"/>
    <ScrollView android:id="@+id/ScrollView01" android:layout_width="wrap_content" android:layout_height="wrap_content">
 
        <TableLayout android:id="@+id/balances_table" android:layout_width="fill_parent" android:layout_height="wrap_content" android:stretchColumns="0">
 
            <TableRow android:id="@+id/TableRow01" android:layout_width="wrap_content" android:layout_height="wrap_content">
                <TextView android:id="@+id/TextView01" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="textfield 1-1"></TextView>
 
                <CheckBox android:id="@+id/CheckBox01" android:layout_width="wrap_content" android:layout_height="wrap_content"></CheckBox>
            </TableRow>
 
        </TableLayout>
    </ScrollView>
</RelativeLayout>
0
314 / 257 / 81
Регистрация: 31.10.2016
Сообщений: 619
19.01.2017, 12:06
Koka77, почему вы не сделаете ViewPager c фрагментами? Для сложных форм, если в ViewPager лежат что-то отличное от ImageView, то с этим легче работать во фрагменте, чем во View.
1
0 / 0 / 0
Регистрация: 16.01.2017
Сообщений: 6
21.01.2017, 18:35  [ТС]
demixdn, я не знаком с фрагментами, но спасибо большое за наводку, буду изучать.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
21.01.2017, 18:35
Помогаю со студенческими работами здесь

Обновление фрагмента с ListView в ViewPager
Есть класс фрагмента, который заполняет адаптер: public class PageFragment extends Fragment implements LoaderCallbacks&lt;Cursor&gt; { ...

Задать позицию ListView в ViewPager
Добрый вечер! Столкнулся с проблемой обновления ListView, после нажатия на кнопку происходит обновление адаптера но элементы ListView...

ViewPager внутри ListView, Как вставить?
Здравствуйте. Есть задача, внутри ListView сделать айтемы, которые содержат ViewPager Вот фрагмент кода, в котором я пытаюсь просто...

ListView + ViewPager как правильнее организовать экспорт в Excel?
Здравствуйте! 1.) на каждой странице Pager'а свой список, как подготавливать данные (со всех страниц) для экспорта в Ecxel-файл? ...

Ошибка при инициализации приложения 0xc0000135 (при запуске игры)
У меня возникла &quot; Ошибка при инициализации приложения (0xc0000135)&quot; и.тп при запуске игры...Решила установить ФраймВорк 2.0 , но при...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
Установка Emscripten SDK (emsdk) и CMake на Windows для сборки C и C++ приложений в WebAssembly (Wasm)
8Observer8 30.01.2026
Чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. Система контроля версиями Git. . .
Подключение Box2D v3 к SDL3 для Android: физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
Влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru