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

NPE при инициализации фрагментов - Программирование Android

Войти
Регистрация
Восстановить пароль
Другие темы раздела
Программирование Android Ошибка при accept() http://www.cyberforum.ru/android-dev/thread1757869.html
Доброго времени суток. Возникла очень большая проблема. Делаю сетевой чат на Android. Сделал сервер package com.riverbandon.com.wifichat; import android.app.Activity; import...
Программирование Android SQLite. SELECT после UPDATE Есть активити "Список документов" и активити "Документ". При закрытии активити "Документ" вносятся изменения в БД и возвращается активити "Список документов". В активити "Список документов" в... http://www.cyberforum.ru/android-dev/thread1757777.html
Программирование Android Настроить в своей программе платный контент
Добрый день. Я новичок и даже близко не представляю как можно подобное настроить. И систему не понимаю. По этому буду признателен за любую помощь. В целом суть вопроса следующая, есть прога....
Перенос проекта из Eclipse в Android Studio Программирование Android
У меня есть простенький чат на Java, проблема в том, что мне нужно перенести клиентскую часть на Андройд... Пробовал на Eclipse ставить плагин ADT, но там появляются другие проблемы. Решил...
Программирование Android Parcel Unmarshalling unknown type code 7667826 at offset 248 http://www.cyberforum.ru/android-dev/thread1757708.html
При передаче одного значения ArrayList из Activity в Activity все проходит хорошо, но при <2 выскакивает ошибка Caused by: java.lang.RuntimeException: Parcel android.os.Parcel@52800e38:...
Программирование Android Запуск чужого проекта в Android Studio Есть пример работы API https://github.com/condesales/easyFoursquare4Android/tree/master/easyFoursquare4AndroidExample, встал вопрос как его запустить у себя, так как при открытии его в студии... подробнее

Показать сообщение отдельно
Illidan_SF
0 / 0 / 0
Регистрация: 11.10.2015
Сообщений: 15

NPE при инициализации фрагментов - Программирование Android

08.06.2016, 14:48. Просмотров 119. Ответов 0
Метки (Все метки)

Пишу приложение, в котором использую фрагменты на главного экране. Общая идея такова: на сервере 4 таблицы, данные из каждой таблицы приходят с сервера и отображаются на одном из фрагментов. Проблема в том, что когда работает код для 1 табы, то все нормально, когда пытаюсь сделать работу 2 и больше табов, появляются ошибки. Код привожу для для 1 табы, остальные 3 написаны также. Для инициализации фрагментов использую наследник класса FragmentPagerAdapter, данные принимаются в виде ArrayList.
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
public class TabsFragmentAdapter extends FragmentPagerAdapter {
 
private Map<Integer, AbstractTabFragment> tabs;
private Context context;
private List<TournamentsDTO> data_tour;
private List<TeamsDTO> data_team;
private List<PlayersDTO> data_play;
private List<CommentatorsDTO> data_comm;
private  TournamentsFragment tournamentsFragment;
private TeamsFragment teamsFragment;
private PlayersFragment playersFragment;
private CommentatorsFragment commentatorsFragment;
 
public TabsFragmentAdapter(Context context, FragmentManager fm) {
    super(fm);
    this.context = context;
    this.data_tour = new ArrayList<>();
    this.data_team = new ArrayList<>();
    this.data_play = new ArrayList<>();
    this.data_comm = new ArrayList<>();
    initTabs(context);
}
@Override
public CharSequence getPageTitle(int position) {
    return tabs.get(position).getTitle();
}
@Override
public Fragment getItem(int position) {
    return tabs.get(position);
}
@Override
public int getCount() {
    return tabs.size();
}
private void initTabs(Context context) {
    tabs = new HashMap<>();
    tournamentsFragment = TournamentsFragment.getInstance(context, data_tour);
    teamsFragment = TeamsFragment.getInstance(context, data_team);
    playersFragment = PlayersFragment.getInstance(context, data_play);
    commentatorsFragment = CommentatorsFragment.getInstance(context, data_comm);
    tabs.put(0, tournamentsFragment);
    tabs.put(1, teamsFragment);
    tabs.put(2, playersFragment);
    tabs.put(3, commentatorsFragment);
}
public void setData_tour(List<TournamentsDTO> data_tour) {
    this.data_tour = data_tour;
    tournamentsFragment.refreshData(data_tour);
}
public void setData_team(List<TeamsDTO> data_team) {
    this.data_team = data_team;
    teamsFragment.refreshData(data_team);
}
public void setData_play(List<PlayersDTO> data_play) {
    this.data_play = data_play;
    playersFragment.refreshData(data_play);
}
public void setData_comm(List<CommentatorsDTO> data_comm) {
    this.data_comm = data_comm;
    commentatorsFragment.refreshData(data_comm);
}
Вот так выглядит инициализация каждого фрагмента
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
public class TournamentsFragment extends AbstractTabFragment {
private static final int LAYOUT = R.layout.fragment_tournaments;
private List<TournamentsDTO> data_tour;
private TournamentsListAdapter tournamentsListAdapter;
public static TournamentsFragment getInstance(Context context, List<TournamentsDTO> data_tour)
{
    Bundle  args = new Bundle();
    TournamentsFragment tournamentsFragment = new TournamentsFragment();
    tournamentsFragment.setArguments(args);
    tournamentsFragment.setContext(context);
    tournamentsFragment.setData_tour(data_tour);   tournamentsFragment.setTitle(context.getString(R.string.fab_item_tournaments));
    return tournamentsFragment;
}
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    view = inflater.inflate(LAYOUT, container, false);
    RecyclerView rv = (RecyclerView) view.findViewById(R.id.recyclerViewTour);
    rv.setLayoutManager(new LinearLayoutManager(context));
    tournamentsListAdapter = new TournamentsListAdapter(data_tour);
    rv.setAdapter(tournamentsListAdapter);
    return view;
}
private void setContext(Context context) {
    this.context = context;
}
private void setData_tour(List<TournamentsDTO> data_tour) {
    this.data_tour = data_tour;
}
public void refreshData(List<TournamentsDTO> list){
    tournamentsListAdapter.setData_tour(list);
    tournamentsListAdapter.notifyDataSetChanged();
}
А вот так они заполняются в MainActivity. Здесь привожу глобальные переменные, метод, который инициализирует табы и метод, который загружает данные из сервера. Данные приходят в виде массива, поэтому перевожу их в список.
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
public class MainActivity extends AppCompatActivity {
private ViewPager viewPager;
private TabsFragmentAdapter adapter1, adapter2, adapter3, adapter4;
 
private void initTabs() {
    viewPager = (ViewPager) findViewById(R.id.viewPager);
    adapter1 = new TabsFragmentAdapter(this, getSupportFragmentManager());
    viewPager.setAdapter(adapter1);
 
    new TournamentTask().execute();
 
    TabLayout tabLayout = (TabLayout) findViewById(R.id.tabLayout);
    tabLayout.setupWithViewPager(viewPager);
}
 
private class TournamentTask extends AsyncTask<Void, Void, TournamentsDTO[]>{
    @Override
    protected TournamentsDTO[] doInBackground(Void... params) {
        RestTemplate template1 = new RestTemplate();
        template1.getMessageConverters().add(new MappingJackson2HttpMessageConverter());
        return template1.getForObject(Constants.URL.GET_ALL_TOURNAMENTS_ITEM, TournamentsDTO[].class);
    }
 
    @Override
    protected void onPostExecute(TournamentsDTO[] tournamentsDTOs) {
        List<TournamentsDTO> listTour = new ArrayList<>();
        int count = 0;
 
        while (count < tournamentsDTOs.length){
            listTour.add(tournamentsDTOs[count]);
            count++;
        }
        adapter1.setData_tour(listTour);
    }
}
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
java.lang.NullPointerException
at illidan.com.statisticsd2.fragments.TournamentsFragment.refreshData(TournamentsFragment.java:68)
at illidan.com.statisticsd2.adapter.TabsFragmentAdapter.setData_tour(TabsFragmentAdapter.java:79)
at illidan.com.statisticsd2.MainActivity$TournamentTask.onPostExecute(MainActivity.java:169)
at illidan.com.statisticsd2.MainActivity$TournamentTask.onPostExecute(MainActivity.java:151)
at android.os.AsyncTask.finish(AsyncTask.java:632)
at android.os.AsyncTask.access$600(AsyncTask.java:177)
at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:645)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.java:5001)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)
at dalvik.system.NativeStart.main(Native Method)
Изменил немного реализацию refreshData()
Java
1
2
3
4
5
6
7
8
public void refreshData(List<TournamentsDTO> list){
    if(tournamentsListAdapter==null){
        data_tour = list; 
    } else {
        tournamentsListAdapter.setData_tour(list);
        tournamentsListAdapter.notifyDataSetChanged();
    }
}
NPE пропали, но данные по прежнему отображаются только на одной табе, вне зависимости от того, какая сейчас показывается.

Есть подозрение, что проблема может быть в getInstance(), но я не знаю что делать...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru