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

Как правильно использовать AsyncTaskLoader в дочернем фрагменте ViewPager-а? - Android

Восстановить пароль Регистрация
 
contedevel
 Аватар для contedevel
57 / 55 / 8
Регистрация: 07.10.2012
Сообщений: 589
06.04.2016, 18:51     Как правильно использовать AsyncTaskLoader в дочернем фрагменте ViewPager-а? #1
Всем доброго времени суток! Собственно проблема в названии темы. Есть код фрагмента:
Кликните здесь для просмотра всего текста
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
public class DayFragment extends Fragment
        implements LoaderManager.LoaderCallbacks<DayAdapter.DayItem[]> {
 
    private static final int CONTENT_LOADER = 0;
 
    private DayAdapter mAdapter = null;
    private int mWeekNumber = 1;
    private int mDayCode = 1;
    private Table.Timetable mTimetable;
    private RecyclerView mRVContent;
 
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        final MainActivity mainActivity = (MainActivity) getActivity();
        View v = inflater.inflate(R.layout.content, container, false);
        mRVContent = (RecyclerView) v.findViewById(R.id.rvContent);
        RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(mainActivity);
        mRVContent.setLayoutManager(layoutManager);
        mAdapter = new DayAdapter(getActivity());
        mRVContent.setAdapter(mAdapter);
        //Initialize the cursor loader
        getLoaderManager().initLoader(CONTENT_LOADER, null, this).forceLoad();
        return v;
    }
 
    @Override
    public Loader<DayAdapter.DayItem[]> onCreateLoader(final int id, Bundle args) {
 
        if(CONTENT_LOADER == id) {
            return new ContentLoader(getContext(), mWeekNumber, mDayCode, mTimetable);
        }
 
        return null;
    }
 
    @Override
    public void onLoadFinished(Loader loader, DayAdapter.DayItem[] items) {
 
        if(CONTENT_LOADER == loader.getId()) {
            mAdapter.setIs24HourFormat(SettingsManager.is24HourFormat(getContext()));
            mAdapter.clear();
 
            for (DayAdapter.DayItem item : items) {
                mAdapter.add(item);
            }
 
            mAdapter.notifyDataSetChanged();
 
            if (items.length == 0) {
                mRVContent.setBackgroundResource(R.drawable.bg_lesson_empty);
            } else {
                mRVContent.setBackgroundColor(0xFFFFFFFF);
            }
        }
    }
 
    @Override
    public void onLoaderReset(Loader loader) {
 
    }
 
    private static final class ContentLoader extends AsyncTaskLoader<DayAdapter.DayItem[]> {
        private final int mWeekNumber;
        private final int mDayCode;
        private final Table.Timetable mTimetable;
 
        public ContentLoader(Context context, final int weekNumber, final int dayCode,
                             Table.Timetable timetable) {
            super(context);
            mWeekNumber = weekNumber;
            mDayCode = dayCode;
            mTimetable = timetable;
        }
 
        @Override
        public DayAdapter.DayItem[] loadInBackground() {
            DatabaseHandler db = new DatabaseHandler(getContext());
            db.openReadable();
            List<Table.Lesson> lessons = db.findLessons(mDayCode, mWeekNumber, mTimetable.getId());
            DayAdapter.DayItem[] items = new DayAdapter.DayItem[lessons.size()];
 
            for (int i = 0; i < items.length; ++i) {
                Table.Lesson lesson = lessons.get(i);
 
                Table.Subject subject = db.getSubject(lesson.getSubjectId());
                Table.Teacher teacher = db.getTeacher(lesson.getTeacherId());
 
                if (teacher == null) {
                    teacher = new Table.Teacher(""); //Empty name
                }
 
                items[i] = new DayAdapter.DayItem()
                        .setId(lesson.getId())
                        .setTitle(subject.getTitle())
                        .setSubtitle(teacher.getName()));
            }
 
            db.close();
 
            return items;
        }
    }
}

Но onLoadFinished метод не вызывается. Я проверил вывод в лог... LoaderManager вызывает onCreateLoader, но никогда не вызывает onLoadFinished только самый первый раз, когда запускаешь приложение и показывается первая страница (и только для этой первой страницы). На этом все! Дальше, если проскролить к следующим страницам и вернуться назад, чтобы пересоздался View, то LoaderManager не вызовет onLoadFinished уже и для первой страницы. При этом методы onCreateLoader и onLoaderReset вызываются как положено. Это такая шутка от Google?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.04.2016, 18:51     Как правильно использовать AsyncTaskLoader в дочернем фрагменте ViewPager-а?
Посмотрите здесь:

Android ViewPager внутри ListView, Как вставить?
Как правильно обновить данные для списка при изменении данных в другом фрагменте? Android
Android Как отобразить ViewPager внутри другой активити
Android ViewPager как узнать текущую View
Как правильно установить и использовать NDK? Android
Как обновить viewpager или listfragment? Android
Скроллинг ViewPager-а как у ListView Android
Вывод во втором фрагменте длины текста, введённого в первом фрагменте активити Android
ViewPager (Tabbed activity) как добавить данные на сраницы? Android
Как листать фрагменты в ViewPager по кнопке? Android
Как правильно использовать LeakCanary? Android
Как заставить работать ViewPager + TabLayout в ScrollView? Android

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

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

Метки
android, android loader
Опции темы

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