package com.freelib.multiitem.item; import android.support.annotation.NonNull; import android.view.View; import android.view.ViewGroup; import com.freelib.multiitem.adapter.BaseItemAdapter; import com.freelib.multiitem.adapter.holder.BaseViewHolder; import com.freelib.multiitem.adapter.holder.HeadFootHolderManager; import com.freelib.multiitem.adapter.holder.ViewHolderManager; import com.freelib.multiitem.listener.OnLoadMoreListener; /** * 加载更多管理类 * <p> * Created by free46000 on 2017/3/26. */ public abstract class LoadMoreManager extends HeadFootHolderManager implements ItemManager { protected BaseItemAdapter adapter; protected OnLoadMoreListener onLoadMoreListener; protected boolean isAutoLoadMore; protected View loadMoreView; protected View.OnClickListener loadMoreClickListener = view -> onLoadMore(); protected boolean isLoadFinish; /** * 默认滑动到底部自动加载为true * * @param onLoadMoreListener 加载更多监听 */ public LoadMoreManager(OnLoadMoreListener onLoadMoreListener) { this(onLoadMoreListener, true); } /** * @param onLoadMoreListener 加载更多监听 * @param isAutoLoadMore 滑动到底部是否自动加载 */ public LoadMoreManager(OnLoadMoreListener onLoadMoreListener, boolean isAutoLoadMore) { this.onLoadMoreListener = onLoadMoreListener; this.isAutoLoadMore = isAutoLoadMore; } @NonNull @Override public BaseViewHolder onCreateViewHolder(@NonNull ViewGroup parent) { BaseViewHolder holder = super.onCreateViewHolder(parent); loadMoreView = holder.itemView; setOnLoadMoreClickListener(loadMoreClickListener); return holder; } /** * 为loadMoreView设置点击监听 */ private void setOnLoadMoreClickListener(View.OnClickListener loadMoreClickListener) { loadMoreView.setOnClickListener(loadMoreClickListener); } @Override public void onBindViewHolder(BaseViewHolder holder, Object o) { if (isNeeLoadMore(holder)) { if (isAutoLoadMore()) { //当可以加载更多数据并开启自动加载后调用 onLoadMore(); } } else { updateLoadInitView(); } } /** * 避免第一次可见时去加载数据 * 若head和foot的数量小于当前loadMore的位置则证明没有ItemData数据,即为RecyclerView加载数据前 * * @param holder * @return 是否需要加载更多 */ protected boolean isNeeLoadMore(@NonNull BaseViewHolder holder) { int headFootCount = adapter.getHeadCount() + adapter.getFootCount(); return headFootCount < holder.getItemPosition(); } /** * 更新加载初始化时的视图<br> * 当RecyclerView加载数据前,即只含有head和foot视图时 */ protected abstract void updateLoadInitView(); @Override protected abstract int getItemLayoutId(); /** * 正在加载更多处理 */ protected void onLoadMore() { if (!isLoadFinish) { getOnLoadMoreListener().onLoadMore(); setOnLoadMoreClickListener(null); updateLoadingMoreView(); } } /** * 更新正在加载更多时的视图 */ protected abstract void updateLoadingMoreView(); /** * 加载完成处理 * * @param isLoadAll 是否加载全部 */ public void loadCompleted(boolean isLoadAll) { setOnLoadMoreClickListener(isLoadAll ? null : loadMoreClickListener); isLoadFinish = isLoadAll; updateLoadCompletedView(isLoadAll); } /** * 更新加载完成时的视图 * * @param isLoadAll 是否加载全部 */ protected abstract void updateLoadCompletedView(boolean isLoadAll); /** * 加载失败处理 */ public void loadFailed() { setOnLoadMoreClickListener(loadMoreClickListener); updateLoadFailedView(); } /** * 更新加载失败的视图 */ protected abstract void updateLoadFailedView(); @Override public boolean isClickable() { return false; } @NonNull @Override public String getItemTypeName() { //防止被复用 return toString(); } @NonNull @Override public ViewHolderManager getViewHolderManager() { return this; } public OnLoadMoreListener getOnLoadMoreListener() { return onLoadMoreListener; } /** * 设置加载更多回调 * * @param onLoadMoreListener OnLoadMoreListener */ public void setOnLoadMoreListener(OnLoadMoreListener onLoadMoreListener) { this.onLoadMoreListener = onLoadMoreListener; } /** * @return 是否自动加载更多 */ public boolean isAutoLoadMore() { return isAutoLoadMore; } /** * 设置是否自动加载更多 */ public void setAutoLoadMore(boolean autoLoadMore) { isAutoLoadMore = autoLoadMore; } public void setAdapter(BaseItemAdapter adapter) { this.adapter = adapter; } }