Форум программистов, компьютерный форум, киберфорум
Наши страницы

Программирование Android

Войти
Регистрация
Восстановить пароль
 
Koka77
0 / 0 / 0
Регистрация: 16.01.2017
Сообщений: 6
#1

Ошибка при инициализации ListView в ViewPager - Программирование Android

17.01.2017, 03:49. Просмотров 378. Ответов 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(android.widget.ListAdapter)' on a null object reference

Заранее спасибо всем откликнувшимся!
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.01.2017, 03:49
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Ошибка при инициализации ListView в ViewPager (Программирование Android):

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

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

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

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

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

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

10
Pablito
2549 / 2031 / 633
Регистрация: 12.05.2014
Сообщений: 7,150
Завершенные тесты: 1
17.01.2017, 12:07 #2
Цитата Сообщение от Koka77 Посмотреть сообщение
Для удобства
это тебе так кажется что это удобство

обычно сюда выкладывают код класса в котором ошибка
0
demixdn
242 / 189 / 59
Регистрация: 31.10.2016
Сообщений: 436
17.01.2017, 12:15 #3
Koka77, java.lang.NullPointerException самая простая ошибка из всех. Вы свой ListView не объявили. Его либо нет в разметке, либо он имеет не тот id, либо вы просто не сделали findViewById.
0
Koka77
0 / 0 / 0
Регистрация: 16.01.2017
Сообщений: 6
17.01.2017, 15:03  [ТС] #4
Дело в том, что список в 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);
//////////////////////////
 
    }
}
0
Миниатюры
Ошибка при инициализации ListView в ViewPager  
demixdn
242 / 189 / 59
Регистрация: 31.10.2016
Сообщений: 436
17.01.2017, 15:23 #5
Koka77, возьмите пример с ViewPager или ViewPager with ListView. Повторите их код. Поймите, как он работает. Вносите изменения, какие вам нужно.
У вас была ошибка при постановке вопроса: не
Ошибка при инициализации ListView в ViewPager
А "Я не знаю, как сделать ViewPager"
0
Koka77
0 / 0 / 0
Регистрация: 16.01.2017
Сообщений: 6
17.01.2017, 15:43  [ТС] #6
demixdn, спасибо за содержательный ответ.
ViewPager без инициализированного списка у меня работает.
В дальнейшем, прошу всех, кто желает потешить свое чсв, делать это за счет своих достижений , а не за счет промахов других. Если вам нечем помочь, не утруждайте себя ответом.
ЗЫ
Отдельное спасибо, всем откликнувшимся по существу вопроса!
0
demixdn
242 / 189 / 59
Регистрация: 31.10.2016
Сообщений: 436
17.01.2017, 15:58 #7
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
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
Koka77
0 / 0 / 0
Регистрация: 16.01.2017
Сообщений: 6
17.01.2017, 18:55  [ТС] #8
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
Koka77
0 / 0 / 0
Регистрация: 16.01.2017
Сообщений: 6
18.01.2017, 21:42  [ТС] #9
В код выше попробовал добавить не список а таблицу,
Таблица инициализируется успешно, но может быть, кто-нибудь сможет объяснить почему не добавляются строки в таблицу.

Я понимаю, что вопросы у меня довольно примитивные, но честное слово, я уже больше двух суток бьюсь с этими проблемами. обшарил весь гугл, простых примеров с 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
demixdn
242 / 189 / 59
Регистрация: 31.10.2016
Сообщений: 436
19.01.2017, 12:06 #10
Koka77, почему вы не сделаете ViewPager c фрагментами? Для сложных форм, если в ViewPager лежат что-то отличное от ImageView, то с этим легче работать во фрагменте, чем во View.
1
Koka77
0 / 0 / 0
Регистрация: 16.01.2017
Сообщений: 6
21.01.2017, 18:35  [ТС] #11
demixdn, я не знаком с фрагментами, но спасибо большое за наводку, буду изучать.
0
21.01.2017, 18:35
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.01.2017, 18:35
Привет! Вот еще темы с ответами:

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

ListView ошибка при прокручивании - Программирование Android
Читаю с json файла данные и добавляю их в ListView, первые 5 отображаются, а когда начинаю прокручивать вниз он выбивает ошибку. ...

Ошибка при выборе Item в ListView - Программирование Android
Здравствуйте уважаемые форумчане. Не могу определить где ошибся. У меня есть ListView где несколько Item-ов при клике на любой из них...

ViewPager - не удалять фрагмент при пролистывании - Программирование Android
Здравствуйте всем. Есть viewPager с тремя фрагментами. Так как он сохраняет объекты слева и справа. Можно реализовать так, когда я листаю...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.