package ren.solid.library.fragment.base;
import android.support.annotation.NonNull;
import android.support.v4.widget.SwipeRefreshLayout;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.View;
import java.util.ArrayList;
import java.util.List;
import me.drakeet.multitype.MultiTypeAdapter;
import me.solidev.statusviewlayout.StatusViewLayout;
import ren.solid.library.R;
import ren.solid.library.utils.ToastUtils;
import ren.solid.library.widget.loadmore.LoadMoreWrapper;
/**
* Created by _SOLID
* Date:2016/9/28
* Time:15:02
* Desc:列表基类,默认线性布局
*/
public abstract class AbsListFragment extends LazyLoadFragment implements IList {
protected StatusViewLayout mStatusViewLayout;
protected SwipeRefreshLayout mSwipeRefreshLayout;
protected RecyclerView mRecyclerView;
protected LoadMoreWrapper mLoadMoreWrapper;
protected int mCurrentPageIndex;
protected int mPageSize;
protected List mItems;
protected boolean isCanLoadMore = true;
private MultiTypeAdapter mMultiTypeAdapter;
public void disAbleLoadMore() {
isCanLoadMore = false;
mLoadMoreWrapper.disableLoadMore();
}
public void disAbleRefresh() {
mSwipeRefreshLayout.setEnabled(false);
}
@Override
protected final int setLayoutResourceID() {
return R.layout.fragment_base_recyclerview;
}
@Override
protected final void init() {
mCurrentPageIndex = getInitPageIndex();
mItems = new ArrayList<>();
mMultiTypeAdapter = getAdapter();
mMultiTypeAdapter.applyGlobalMultiTypePool();
mLoadMoreWrapper = new LoadMoreWrapper(getContext(), mMultiTypeAdapter);
mLoadMoreWrapper.setOnLoadListener(new LoadMoreWrapper.OnLoadListener() {
@Override
public void onRetry() {
loadData(mCurrentPageIndex);
}
@Override
public void onLoadMore() {
if (isCanLoadMore)
AbsListFragment.this.loadMore();
}
});
}
protected void registerItemProvider(MultiTypeAdapter adapter) {
}
@Override
protected void setUpView() {
mStatusViewLayout = $(R.id.status_view_layout);
mSwipeRefreshLayout = $(R.id.swipe_refresh_layout);
mRecyclerView = $(R.id.recyclerview);
mRecyclerView.setLayoutManager(getLayoutManager());
mRecyclerView.setAdapter(mLoadMoreWrapper);
customConfig();
mSwipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
@Override
public void onRefresh() {
refreshData();
}
});
mStatusViewLayout.setOnRetryListener(new View.OnClickListener() {//错误重试
@Override
public void onClick(View v) {
mStatusViewLayout.showLoading();
loadData(getInitPageIndex());
}
});
registerItemProvider(mMultiTypeAdapter);
}
@Override
protected final void setUpData() {
}
@Override
protected void lazyLoad() {
showLoading();
loadData(getInitPageIndex());//初始加载首页数据
}
@Override
public final void refreshData() {
mCurrentPageIndex = getInitPageIndex();
if (isCanLoadMore)
mLoadMoreWrapper.showLoadMore();
loadData(getInitPageIndex());
}
@Override
public final void loadMore() {
loadData(++mCurrentPageIndex);
}
@Override
public abstract void loadData(int pageIndex);
//region 可直接调用的方法
/**
* 列表数据接收成功时调用(相关的实现类需要手动去调用此方法)
*
* @param pageIndex 当前请求的页数
* @param items 返回的数据
*/
@SuppressWarnings("unchecked")
protected final void onDataSuccessReceived(int pageIndex, List items) {
showContent();
if (pageIndex == getInitPageIndex() && (items == null || items.size() <= 0)) {//无数据
showEmpty(getEmptyMsg());
} else if (pageIndex == getInitPageIndex()) {//刷新
mItems.clear();
mItems.addAll(items);
if (items.size() < mPageSize) {
mLoadMoreWrapper.showLoadComplete();
}
} else if (items != null && items.size() != 0) {//加载更多
mItems.addAll(items);
} else {//没有更多数据了
mCurrentPageIndex--;
mLoadMoreWrapper.showLoadComplete();
}
mLoadMoreWrapper.notifyDataSetChanged();
}
/**
* 得到当前列表数据
*
* @return 当前列表数据
*/
protected final List getItems() {
return mItems;
}
/**
* 添加分隔线
*
* @param itemDecoration 分隔线
*/
protected final void addItemDecoration(RecyclerView.ItemDecoration itemDecoration) {
if (mRecyclerView != null)
mRecyclerView.addItemDecoration(itemDecoration);
}
//endregion
//region 根据具体的情况可选择性实现下面方法
protected void customConfig() {
}
protected int getInitPageIndex() {
return 1;
}
protected MultiTypeAdapter getAdapter() {
return new MultiTypeAdapter(mItems);
}
@NonNull
protected RecyclerView.LayoutManager getLayoutManager() {
return new LinearLayoutManager(getContext());
}
@NonNull
protected String getEmptyMsg() {
return "无数据";
}
//endregion
//region 数据加载状态的处理
@Override
public void showError(Exception e) {
if (mCurrentPageIndex == getInitPageIndex()) {
mStatusViewLayout.showError(e.getMessage());
} else {
mLoadMoreWrapper.showLoadError();
ToastUtils.getInstance().showToast(e.getMessage());
}
mSwipeRefreshLayout.setRefreshing(false);
}
@Override
public void showEmpty(String msg) {
mStatusViewLayout.showEmpty(msg);
mSwipeRefreshLayout.setRefreshing(false);
}
@Override
public void showLoading() {
mStatusViewLayout.showLoading();
}
@Override
public void showContent() {
mStatusViewLayout.showContent();
mSwipeRefreshLayout.setRefreshing(false);
}
//endregion
public boolean isTop() {
if (mRecyclerView != null && mRecyclerView.getLayoutManager() instanceof LinearLayoutManager) {
LinearLayoutManager linearLayoutManager = (LinearLayoutManager) mRecyclerView.getLayoutManager();
int firstVisiblePosition = linearLayoutManager.findFirstVisibleItemPosition();
if (firstVisiblePosition != 0) {
return false;
}
}
return true;
}
public boolean scrollToTop() {
if (!isTop()) {
mRecyclerView.smoothScrollToPosition(0);
return false;
}
return true;
}
}