Форум программистов, компьютерный форум, киберфорум
Наши страницы
Программирование Android
Войти
Регистрация
Восстановить пароль
 
bruimaifia
0 / 0 / 0
Регистрация: 28.02.2014
Сообщений: 20
1

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

22.02.2019, 01:54. Просмотров 254. Ответов 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
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.02.2019, 01:54
Ответы с готовыми решениями:

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

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

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

Загрузка в адаптер из другой коллекции 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...

1
jaman_smk
104 / 84 / 27
Регистрация: 07.01.2017
Сообщений: 447
22.02.2019, 06:55 2
bruimaifia, https://stackoverflow.com/questions/...rly-after-dele
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.02.2019, 06:55

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

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

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


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

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

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