package com.cheikh.lazywaimai.base; import android.os.Bundle; import android.support.annotation.DrawableRes; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.view.View; import java.util.List; import butterknife.Bind; import com.cheikh.lazywaimai.R; import com.cheikh.lazywaimai.model.bean.ResponseError; import com.cheikh.lazywaimai.util.ContentView; import com.cheikh.lazywaimai.util.ViewEventListener; import com.cheikh.lazywaimai.ui.adapter.wrapper.LoadMoreWrapperAdapter; import com.cheikh.lazywaimai.util.ToastUtil; import com.cheikh.lazywaimai.widget.MultiStateView; import com.cheikh.lazywaimai.widget.refresh.OnRefreshListener; import com.cheikh.lazywaimai.widget.refresh.RefreshLayout; @ContentView(R.layout.fragment_recyclerview) public abstract class BaseListFragment<T, UC> extends BaseFragment<UC> implements BaseController.ListUi<T, UC> { @Bind(R.id.multi_state_view) MultiStateView mMultiStateView; @Bind(R.id.refresh_layout) RefreshLayout mRefreshLayout; @Bind(R.id.recycler_view) RecyclerView mRecyclerView; protected LoadMoreWrapperAdapter<T> mAdapter; @Override protected void initializeViews(Bundle savedInstanceState) { mRefreshLayout.setEnabled(getEnableRefresh()); mRefreshLayout.setOnRefreshListener(new OnRefreshListener() { @Override public void onRefresh() { refreshPage(); } }); mAdapter = new LoadMoreWrapperAdapter<>(getAdapter()); mAdapter.setViewEventListener(new ViewEventListener<T>() { @Override public void onViewEvent(int actionId, T item, int position, View view) { onItemClick(actionId, item); } }); mAdapter.setOnLoadMoreListener(new LoadMoreWrapperAdapter.OnLoadMoreListener() { @Override public void onLoadMore() { nextPage(); } }); mRecyclerView.setLayoutManager(new LinearLayoutManager(getActivity())); mRecyclerView.setAdapter(mAdapter); mMultiStateView.setState(getDefaultState()); } protected void refreshPage() {} protected void nextPage() {} protected void onItemClick(int actionId, T item) {} protected boolean getEnableRefresh() { return mMultiStateView.getState() == MultiStateView.STATE_CONTENT || mMultiStateView.getState() == MultiStateView.STATE_EMPTY; } @MultiStateView.State protected int getDefaultState() { return MultiStateView.STATE_LOADING; } protected abstract BaseAdapter<T> getAdapter(); @DrawableRes protected int getEmptyIcon() { return R.drawable.ic_empty; } protected String getEmptyTitle() { return getString(R.string.label_empty_data); } protected boolean isDisplayError(ResponseError error) { return mMultiStateView.getState() != MultiStateView.STATE_CONTENT; } @DrawableRes protected int getErrorIcon(ResponseError error) { return R.drawable.ic_exception; } protected String getErrorTitle(ResponseError error) { return getString(R.string.label_error_network_is_bad); } protected String getErrorButton(ResponseError error) { return getString(R.string.label_click_button_to_retry); } protected void onRetryClick(ResponseError error) { mMultiStateView.setState(MultiStateView.STATE_LOADING); refreshPage(); } @Override public void onStartRequest(int page) { if (page == 1) { if (mMultiStateView.getState() != MultiStateView.STATE_CONTENT) { mMultiStateView.setState(MultiStateView.STATE_LOADING); } else { mRefreshLayout.setRefreshing(true); } } } @Override public void onFinishRequest(List<T> items, int page, boolean haveNextPage) { if (mRefreshLayout.isRefreshing()) { mRefreshLayout.setRefreshing(false); } if (mAdapter.isLoading()) { mAdapter.finishLoadMore(); } if (items != null && !items.isEmpty()) { if (page == 1) { mAdapter.setItems(items); mMultiStateView.setState(MultiStateView.STATE_CONTENT); } else { mAdapter.addItems(items); } } else { if (page == 1) { mMultiStateView.setState(MultiStateView.STATE_EMPTY) .setIcon(getEmptyIcon()) .setTitle(getEmptyTitle()); } else { ToastUtil.showToast(R.string.toast_error_not_have_more); } } mRefreshLayout.setEnabled(getEnableRefresh()); mAdapter.setEnableLoadMore(haveNextPage); } @Override public void onResponseError(final ResponseError error) { if (mRefreshLayout.isRefreshing()) { mRefreshLayout.setRefreshing(false); } if (mAdapter.isLoading()) { mAdapter.finishLoadMore(); } if (isDisplayError(error)) { mMultiStateView.setState(MultiStateView.STATE_ERROR) .setIcon(getErrorIcon(error)) .setTitle(getErrorTitle(error)) .setButton(getErrorButton(error), new View.OnClickListener() { @Override public void onClick(View view) { onRetryClick(error); } }); } else { ToastUtil.showToast(error.getMessage()); } mRefreshLayout.setEnabled(getEnableRefresh()); } }