Страницы

Поиск по вопросам

вторник, 27 ноября 2018 г.

Progressbar в endlessList

Есть бесконечный список, в котором подгружаю n-oe количество элементов после того как пролистал до самого низа. Необходимо во время этой подгрузки отображать progressBar в самом низу. Раньше использовал footerView, состоящего из progressBar, просто скрывал и отображал его когда было необходимо. Но теперь я использую не listView, а recyclerView, в который, увы, нельзя стандартными способами вставить header или footer.. Погуглив, нашел пару библиотек, которые используют свой кастомный адаптер, вместо RecyclerView.Adapter. Так не хочется перелопачивать всё в проекте и прикручивать эту "эболу". Может кто сталкивался с такой проблемой?


Ответ

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(List data) { if (mCatalogData == null) { mCatalogData = new ArrayList<>();
} mCatalogData.addAll(data); notifyItemInserted(getItemCount() - data.size()); }

Комментариев нет:

Отправить комментарий