package com.sun.bingo.ui.fragment;
import android.os.Bundle;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.FrameLayout;
import android.widget.TextView;
import com.framework.base.BaseAsyncFragment;
import com.framework.base.BaseControl;
import com.mingle.widget.LoadingView;
import com.orhanobut.logger.Logger;
import com.sun.bingo.R;
import com.sun.bingo.adapter.RecyclerViewAdapter;
import com.sun.bingo.model.BingoEntity;
import com.sun.bingo.model.UserEntity;
import com.sun.bingo.model.eventbus.EventEntity;
import com.sun.bingo.model.eventbus.EventType;
import com.sun.bingo.widget.CircleRefreshLayout;
import org.greenrobot.eventbus.EventBus;
import org.greenrobot.eventbus.Subscribe;
import org.greenrobot.eventbus.ThreadMode;
import java.util.ArrayList;
import java.util.List;
import butterknife.BindView;
import butterknife.ButterKnife;
import cn.bmob.v3.BmobUser;
public abstract class BaseListFragment<T extends BaseControl> extends BaseAsyncFragment<T> implements CircleRefreshLayout.OnCircleRefreshListener {
@BindView(R.id.recycler_view)
RecyclerView recyclerView;
@BindView(R.id.circle_refresh_layout)
CircleRefreshLayout circleRefreshLayout;
@BindView(R.id.loadingView)
LoadingView loadingView;
@BindView(R.id.tv_status)
TextView tvStatus;
@BindView(R.id.ll_status)
FrameLayout llStatus;
protected UserEntity userEntity;
private int lastVisibleItem;
private LinearLayoutManager mLinearLayoutManager;
protected List<BingoEntity> mEntities;
protected RecyclerViewAdapter mAdapter;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Logger.i("log-fragment", "(" + getClass().getSimpleName() + ".java)");
initData();
EventBus.getDefault().register(this);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_bingo_list, container, false);
ButterKnife.bind(this, rootView);
initView();
initListener();
startRefresh();
return rootView;
}
private void initData() {
userEntity = BmobUser.getCurrentUser(getActivity(), UserEntity.class);
}
private void initView() {
mLinearLayoutManager = new LinearLayoutManager(getActivity());
recyclerView.setLayoutManager(mLinearLayoutManager);
loadingView.setVisibility(View.VISIBLE);
mEntities = new ArrayList<>();
mAdapter = new RecyclerViewAdapter(getActivity(), mEntities);
recyclerView.setAdapter(mAdapter);
}
private void initListener() {
recyclerView.addOnScrollListener(new PauseOnScrollListener());
circleRefreshLayout.setOnRefreshListener(this);
}
class PauseOnScrollListener extends RecyclerView.OnScrollListener {
@Override
public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
super.onScrollStateChanged(recyclerView, newState);
switch (newState) {
case RecyclerView.SCROLL_STATE_IDLE:
int size = recyclerView.getAdapter().getItemCount();
if (lastVisibleItem + 1 == size && mAdapter.isLoadMoreShown() &&
!mAdapter.getLoadMoreViewText().equals(getString(R.string.load_data_adequate))) {
onScrollLast();
}
break;
case RecyclerView.SCROLL_STATE_DRAGGING:
break;
}
}
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
lastVisibleItem = mLinearLayoutManager.findLastVisibleItemPosition();
}
}
private void completeRefresh() {
if (circleRefreshLayout != null) {
circleRefreshLayout.completeRefresh();
}
if (loadingView != null && loadingView.getVisibility() == View.VISIBLE) {
loadingView.setVisibility(View.GONE);
}
}
@Override
public void onDestroyView() {
super.onDestroyView();
EventBus.getDefault().unregister(this);
}
@Subscribe(threadMode = ThreadMode.MAIN)
public void eventBusListener(EventEntity event) {
switch (event.getType()) {
case EventType.EVENT_TYPE_UPDATE_BINGO_LIST:
onRefreshStart();
break;
}
}
@Override
public void startRefresh() {
//让子弹飞一会儿,防止刷新太快哦
messageProxy.postRunnableDelay(new Runnable() {
@Override
public void run() {
onRefreshStart();
}
}, 500);
}
/**
* ---------------------
* 请求列表数据的回调接口们,嗨,你们好。
* ---------------------
*/
//数据为空
public void getDataEmpty() {
completeRefresh();
llStatus.setVisibility(View.VISIBLE);
mAdapter.setLoadMoreViewVisibility(View.GONE);
tvStatus.setVisibility(View.VISIBLE);
tvStatus.setText(getString(emptyDataString()));
mEntities.clear();
mAdapter.notifyDataSetChanged();
}
//数据足够PAGE_SIZE
public void getDataAdequate() {
completeRefresh();
llStatus.setVisibility(View.GONE);
mAdapter.setLoadMoreViewVisibility(View.VISIBLE);
mAdapter.setLoadMoreViewText(getString(R.string.loading_data));
List<BingoEntity> entities = mModel.getList(1);
mEntities.clear();
mEntities.addAll(entities);
mAdapter.notifyDataSetChanged();
}
//数据不足PAGE_SIZE
public void getDataInadequate() {
completeRefresh();
llStatus.setVisibility(View.GONE);
mAdapter.setLoadMoreViewVisibility(View.GONE);
List<BingoEntity> entities = mModel.getList(1);
mEntities.clear();
mEntities.addAll(entities);
mAdapter.notifyDataSetChanged();
}
//加载失败
public void getDataFail() {
completeRefresh();
llStatus.setVisibility(View.VISIBLE);
mAdapter.setLoadMoreViewVisibility(View.GONE);
tvStatus.setVisibility(View.VISIBLE);
tvStatus.setText(R.string.load_data_fail);
mEntities.clear();
mAdapter.notifyDataSetChanged();
}
//数据为空 (More)
public void getMoreDataEmpty() {
mAdapter.setLoadMoreViewVisibility(View.GONE);
}
//数据足够PAGE_SIZE (More)
public void getMoreDataAdequate() {
mAdapter.setLoadMoreViewVisibility(View.VISIBLE);
List<BingoEntity> entities = mModel.getList(2);
mEntities.addAll(entities);
mAdapter.notifyDataSetChanged();
}
//数据不足PAGE_SIZE (More)
public void getMoreDataInadequate() {
mAdapter.setLoadMoreViewVisibility(View.VISIBLE);
mAdapter.setLoadMoreViewText(getString(R.string.load_data_adequate));
List<BingoEntity> entities = mModel.getList(2);
mEntities.addAll(entities);
mAdapter.notifyDataSetChanged();
}
//加载失败 (More)
public void getMoreDataFail() {
mAdapter.setLoadMoreViewVisibility(View.VISIBLE);
mAdapter.setLoadMoreViewText(getString(R.string.load_data_fail));
}
/**
* ---------------------
* 抽象方法们,你们辛苦啦!
* ---------------------
*/
protected abstract void onRefreshStart(); //下拉刷新数据
protected abstract void onScrollLast(); //上拉加载数据
protected abstract int emptyDataString(); //数据为空时的显示文字
}