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

Подгрузка из Firebase Firestore в recycle view

22.02.2019, 01:54. Показов 1540. Ответов 1

Студворк — интернет-сервис помощи студентам
Загружаю данные из Firebase Firestore в recycle view и пытаюсь сделать постепенную подгрузку данных при достижении конца списка.

Вроде бы получилось, но работает не совсем корректно:

1) при переходе на другой фрагмент и возвращении обратно на этот, отображаются не все записи и подгрузка не работает

2) при попытке обновить список с помощью swipeRefreshLayout он обновляется, но показываются только последние 4 записи, подгрузка также перестает работать

3) переодически при прокрутке (например, когда записей меньше чем сам лимит) может вылетать с ошибкой в 145 строке
Java
1
lastVisible = task.getResult().getDocuments().get(task.getResult().size() - 1);
пишет length=0; index=-1

Как решить эти проблемы? Помогите, пожалуйста

HomeFragment.java
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
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
public class HomeFragment extends Fragment {
 
    private final int LIMIT_ITEM_LOAD = 4;
 
    private View item_1, item_2, item_3, item_4, item_5;
    private SwipeRefreshLayout swipeRefresh;
 
    private RecyclerView recyclerView;
    private LinearLayoutManager linearLayoutManager;
    private DocumentSnapshot lastVisible;
    private boolean isScrolling;
    private boolean isLastItemReached;
    private List<Meeting> list;
    private MeetingAdapter adapter;
 
 
    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_home, container, false);
 
        item_1 = getActivity().findViewById(R.id.item_1);
        item_2 = getActivity().findViewById(R.id.item_2);
        item_3 = getActivity().findViewById(R.id.item_3);
        item_4 = getActivity().findViewById(R.id.item_4);
        item_5 = getActivity().findViewById(R.id.item_5);
 
        BottomNavigationView navigation = getActivity().findViewById(R.id.navigation);
        navigation.getMenu().getItem(0).setChecked(true);
        setBorderItemSelected(item_1);
 
        Toolbar toolbar = view.findViewById(R.id.toolbar);
        ((AppCompatActivity)getActivity()).setSupportActionBar(toolbar);
        ((AppCompatActivity)getActivity()).getSupportActionBar().setDisplayShowTitleEnabled(false);
        toolbar.setTitle("Лента событий");
        setHasOptionsMenu(true);
 
 
        recyclerView = view.findViewById(R.id.recyclerView);
        linearLayoutManager = new LinearLayoutManager(getContext());
        recyclerView.setLayoutManager(linearLayoutManager);
 
        swipeRefresh = view.findViewById(R.id.swipeRefresh);
        swipeRefresh.setColorSchemeResources(
                R.color.orange_300,
                R.color.pink_300,
                R.color.green_300,
                R.color.blue_300);
        swipeRefresh.setOnRefreshListener(refreshListener);
 
        getLastKeyFromFirebase();
 
        return view;
    }
 
 
 
    private SwipeRefreshLayout.OnRefreshListener refreshListener = new SwipeRefreshLayout.OnRefreshListener() {
 
        @Override
        public void onRefresh() {
            new Handler().postDelayed(new Runnable() {
                @Override public void run() {
                    swipeRefresh.setRefreshing(true);
                    getLastKeyFromFirebase();
                    swipeRefresh.setRefreshing(false);
                }
            },1000);
        }
    };
 
 
 
    private void getLastKeyFromFirebase() {
 
        Query query = FirebaseFirestore.getInstance()
                .collection("meetings")
                .orderBy("id", Query.Direction.DESCENDING)
                .limit(LIMIT_ITEM_LOAD);
 
        query.get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
            @Override
            public void onComplete(@NonNull Task<QuerySnapshot> task) {
                if (task.isSuccessful()) {
                    list = new ArrayList<>();
 
                    for (DocumentSnapshot document : task.getResult()) {
                        Meeting meeting = document.toObject(Meeting.class);
                        list.add(meeting);
                    }
 
                    adapter = new MeetingAdapter(list, getContext());
                    recyclerView.setAdapter(adapter);
                    lastVisible = task.getResult().getDocuments().get(task.getResult().size() - 1);
                    Toast.makeText(getContext(), "Основа загружена", Toast.LENGTH_SHORT).show();
 
                    recyclerView.addOnScrollListener(onScrollListener);
 
                }
            }
        });
    }
 
 
 
    private RecyclerView.OnScrollListener onScrollListener = new RecyclerView.OnScrollListener() {
 
        @Override
        public void onScrollStateChanged(@NonNull RecyclerView recyclerView, int newState) {
            super.onScrollStateChanged(recyclerView, newState);
 
            if (newState == AbsListView.OnScrollListener.SCROLL_STATE_TOUCH_SCROLL) {
                isScrolling = true;
            }
        }
 
        @Override
        public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) {
            super.onScrolled(recyclerView, dx, dy);
 
            int firstVisibleItem = linearLayoutManager.findFirstVisibleItemPosition();
            int visibleItemCount = linearLayoutManager.getChildCount();
            int totalItemCount = linearLayoutManager.getItemCount();
            Log.d("Ok","firstVisibleItem = " + firstVisibleItem);
            Log.d("Ok","visibleItemCount = " + visibleItemCount);
            Log.d("Ok","totalItemCount = " + totalItemCount);
 
            if (isScrolling && (firstVisibleItem + visibleItemCount == totalItemCount) && !isLastItemReached) {
                isScrolling = false;
 
                Query nextQuery = FirebaseFirestore.getInstance()
                        .collection("meetings")
                        .orderBy("id", Query.Direction.DESCENDING)
                        .startAfter(lastVisible)
                        .limit(LIMIT_ITEM_LOAD);
                nextQuery.get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
                    @Override
                    public void onComplete(@NonNull Task<QuerySnapshot> task) {
                        for (DocumentSnapshot document : task.getResult()) {
                            Meeting meeting = document.toObject(Meeting.class);
                            list.add(meeting);
                        }
                        adapter.notifyDataSetChanged();
 
                        lastVisible = task.getResult().getDocuments().get(task.getResult().size() - 1);
                        Toast.makeText(getContext(), "Подгрузка завершена", Toast.LENGTH_SHORT).show();
 
                        if (task.getResult().size() < LIMIT_ITEM_LOAD) {
                            isLastItemReached = true;
                        }
                    }
                });
            }
        }
 
    };
 
 
 
 
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case R.id.action_filtration:
                //
                break;
            default:
                break;
        }
        return true;
    }
 
 
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
        inflater.inflate(R.menu.toolbar_home, menu);
        super.onCreateOptionsMenu(menu, inflater);
    }
 
}

MeetingAdapter.java
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
public class MeetingAdapter extends RecyclerView.Adapter<MeetingAdapter.MyViewHolder> {
 
    private List<Meeting> meetingsList;
    private Context context;
 
    public MeetingAdapter(List<Meeting> meetingsList, Context context) {
        this.meetingsList = meetingsList;
        this.context = context;
    }
 
    @NonNull
    @Override
    public MeetingAdapter.MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View itemView = LayoutInflater.from(context).inflate(R.layout.item_meeting, parent, false);
        return new MeetingAdapter.MyViewHolder(itemView);
    }
 
    @Override
    public void onBindViewHolder(@NonNull MeetingAdapter.MyViewHolder holder, int position) {
        holder.date.setText(meetingsList.get(position).getDate());
        holder.title.setText(meetingsList.get(position).getTitle());
    }
 
    @Override
    public int getItemCount() {
        return meetingsList.size();
    }
 
    class MyViewHolder extends RecyclerView.ViewHolder {
 
        private TextView date, title;
 
        MyViewHolder(View itemView) {
            super(itemView);
 
            date = itemView.findViewById(R.id.date);
            title = itemView.findViewById(R.id.title);
        }
    }
 
}
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
22.02.2019, 01:54
Ответы с готовыми решениями:

Работа с Firebase cloud firestore
Здраствуйте, помогите разобраться, хочу сделать в android studio, чтобы при нажатии на кнопку считывалась 1 строчка из базы cloud...

Как обновить Recycle View после добавления нового элемента в БД? Используется Cursor
Проблема такова, после добавления элемента в БД, список элементов Recycle View не обновляется, приходится заново пересоздавать фрагмент, а...

Excel и Power Query подгрузка картинок и отображение в Power View
Добрый день. Осваиваю Power Query, Power Pivot и Power View в эксель (2016 версия). Пробую подгрузить данные, как по данному...

1
111 / 89 / 29
Регистрация: 07.01.2017
Сообщений: 456
22.02.2019, 06:55
bruimaifia, https://stackoverflow.com/ques... after-dele
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
22.02.2019, 06:55
Помогаю со студенческими работами здесь

Загрузка в адаптер из другой коллекции Firestore
В адаптере в методе bind устанавливаю данные из List (во фрагменте загружаю их туда из Firestore). Но еще нужны данные, которые находятся в...

Recycle/CardView NullPointerException
(card_view_address)- &lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt; &lt;LinearLayout xmlns:android=&quot;http://schemas.android.com/apk/res/android&quot; ...

recycle.bin desktop.ini
принес домой внешний ЖД до этого побывал по моим подозрениям на зараженном компьютере и теперь на каждом ЖД есть папка $RECYCLE.BIN ...

Как восстановить RECYCLE.BIN
Всем привет. Удалил unlockerом случайно $RECYCLE.BIN. Проводник не отвечает, как исправить?

В чем разница (View view) и (View v)
Я только начинаю изучать программирование под андроид (до этого вобще программированием не занимался), по гуглу удалось найти только...


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru