#android #progress_bar
Есть бесконечный список, в котором подгружаю n-oe количество элементов после того как пролистал до самого низа. Необходимо во время этой подгрузки отображать progressBar в самом низу. Раньше использовал footerView, состоящего из progressBar, просто скрывал и отображал его когда было необходимо. Но теперь я использую не listView, а recyclerView, в который, увы, нельзя стандартными способами вставить header или footer.. Погуглив, нашел пару библиотек, которые используют свой кастомный адаптер, вместо RecyclerView.Adapter. Так не хочется перелопачивать всё в проекте и прикручивать эту "эболу". Может кто сталкивался с такой проблемой?
Ответы
Ответ 1
RecyclerView стал очень удобным в кастомизации, это как Lada, большое поле для фантазий, после выхода с конвейера =) Я недавно также у себя задавался вопросом, как сделать бесконечный список, в итоге сделал так С начала переопределил метод @Override public int getItemViewType(int position) { return isFooter(position) ? TYPE_FOOTER : TYPE_ITEM; } где константы: public static final int TYPE_ITEM = 0; public static final int TYPE_FOOTER = 1; public boolean isFooter(int position) { return mIsFooterEnabled && getItemCount() == position + (mIsFooterEnabled ? 1 : 0); } так как футер не входит в общий массив то дополним метод @Override public int getItemCount() { return mCatalogData != null ? mCatalogData.size() + (mIsFooterEnabled ? 1 : 0) : 0; } футер включаем или выключаем в случае если адаптер реюзаем ну или конец списка. private boolean mIsFooterEnabled; public void setFooterEnabled(boolean isFooterEnabled) { mIsFooterEnabled = isFooterEnabled; } Вот так выглядят Холдеры public static class ProductViewHolder extends RecyclerView.ViewHolder { ProductViewHolder(View itemView) { super(itemView); } } public static class FooterViewHolder extends RecyclerView.ViewHolder { FooterViewHolder(View itemView) { super(itemView); } } И соответственно метод onBindViewHolder @Override public void onBindViewHolder(RecyclerView.ViewHolder holder, int i) { if (holder instanceof ProductViewHolder) { ProductViewHolder productViewHolder = (ProductViewHolder) holder; } else { } } ну а в этом методе ставим нужные вью. @Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup viewGroup, int type) { if (type == TYPE_ITEM) { View v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.catalog_list_item, viewGroup, false); return new ProductViewHolder(v); } else { View v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.catalog_list_footer, viewGroup, false); return new FooterViewHolder(v); } } что написано в catalog_list_item кидать не буду, излишне, а в catalog_list_footer просто прогресс бар. UPD Подгрузку начинаю делать, когда покажется вью на экране с позицией getItemCount()-10. mGridView.addOnScrollListener(new RecyclerView.OnScrollListener() { @Override public void onScrolled(RecyclerView recyclerView, int dx, int dy) { int position = ((GridLayoutManager) recyclerView.getLayoutManager()).findLastVisibleItemPosition(); int updatePosition = recyclerView.getAdapter().getItemCount() - 10; if (position >= updatePosition) { loadNewItems(); } } }); а данные вставляю вот так (Метод внутри адпатера) public void setData(Listdata) { if (mCatalogData == null) { mCatalogData = new ArrayList<>(); } mCatalogData.addAll(data); notifyItemInserted(getItemCount() - data.size()); } Ответ 2
Если кому интересно будет, то я сделал таким образом: 1) В разметку с RecyclerView добавил progressBar2) Далее во фрагменте, к recyclerView вешаю слушатель onScrollListener в котором смотрю, когда необходимо грузить элементы, то показываю свой progressBar if (loading) { if ((visibleItemCount + pastVisiblesItems) >= totalItemCount) { pageNumber++; progressBar.setVisibility(View.VISIBLE); loadList(); loading = false; } } 3) В своём методе loadList() , после загрузки элементов и обновлении адаптера, присваиваю значение loading = true и progressBar.setVisibility(View.GONE). Единственное что остается сделать, это плавное появление progressBara снизу.
Комментариев нет:
Отправить комментарий