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

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

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

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

08.06.2016, 14:48. Просмотров 109. Ответов 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(), но я не знаю что делать...
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.06.2016, 14:48     NPE при инициализации фрагментов
Посмотрите здесь:

NPE на присвоении адаптера листу, при скрещивании двух проектов - Программирование Android
Скрещивал два проекта (ActionBar Tabs и CustomizeListView). Вообщем Табы и на них лист. Все было хорошо, но при запуске выдает NPE при...

Exception при использовании анимации фрагментов - Программирование Android
В приложении есть 2 фрагмента сменяющие друг друга на экране. fragmentTransaction = fragmentManager.beginTransaction(); ...

Ошибка при инициализации ListView в ViewPager - Программирование Android
Всем доброго времени суток. Столкнулся с проблемой, в простом примере создания ViewPager, все работает до тех пор, пока не инициализирую...

Callback фрагментов - Программирование Android
День добрый. Не совсем понимаю механизм работы коллбэков. Может кто-нибудь проиллюстрировать на конкретном примере? Допустим,...

Очистка стека фрагментов - Программирование Android
Правильно ли использовать след. код или можно по проще и &quot;умнее&quot; это делать? p.s. данный код выполняется при переходе на другую...

Жизненный цикл фрагментов - Программирование Android
В программе есть 2 фрагмента. один заменяется другим при наступлении определенного события(общий контейнер у них). я забиндил на onPause...

ViewPager обновление фрагментов - Программирование Android
Использую viewpager имеет три фрагмента. Как обновлять данные для второго фрагмента с первого фрагмента. И наоборот. Метод ...

Анимация фрагментов и активити - Программирование Android
Задаю анимацию для фрагментов и активити, но она работает на моём устройстве только в том случае, если в настройках телефона включена...

Взаимодействие вложенных фрагментов - Программирование Android
Есть главная activity, на неё помещён Фрагмент_1, который внутрь себя помещает Фрагмент_2. Как Фрагмент_2 может получить ссылку на...

Загрузка двух фрагментов в ландшафтной ориентации - Программирование Android
Всем привет!!! Помогите решить кое-какую проблему. Во фрагменте главной Активности(MainFragmentActivity) есть кнопка которая загружает...


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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ответ Создать тему
Опции темы

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