Есть бесконечный список, в котором подгружаю 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
}
mCatalogData.addAll(data);
notifyItemInserted(getItemCount() - data.size());
}
Комментариев нет:
Отправить комментарий