package com.shizhefei.mvc.viewhandler;
import android.support.v4.view.ViewCompat;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.RecyclerView.Adapter;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnClickListener;
import com.shizhefei.mvc.ILoadViewFactory.FootViewAdder;
import com.shizhefei.mvc.ILoadViewFactory.ILoadMoreView;
import com.shizhefei.mvc.MVCHelper.OnScrollBottomListener;
import com.shizhefei.recyclerview.HFAdapter;
import com.shizhefei.recyclerview.HFRecyclerAdapter;
public class RecyclerViewHandler implements ViewHandler {
@Override
public boolean handleSetAdapter(View contentView, Object adapter, ILoadMoreView loadMoreView, OnClickListener onClickLoadMoreListener) {
final RecyclerView recyclerView = (RecyclerView) contentView;
boolean hasInit = false;
Adapter<?> adapter2 = (Adapter<?>) adapter;
if (loadMoreView != null) {
final HFAdapter hfAdapter;
if (adapter instanceof HFAdapter) {
hfAdapter = (HFAdapter) adapter;
} else {
hfAdapter = new HFRecyclerAdapter(adapter2,false);
}
adapter2 = hfAdapter;
loadMoreView.init(new RecyclerViewFootViewAdder(recyclerView, hfAdapter), onClickLoadMoreListener);
hasInit = true;
}
recyclerView.setAdapter(adapter2);
return hasInit;
}
@Override
public void setOnScrollBottomListener(View contentView, OnScrollBottomListener onScrollBottomListener) {
final RecyclerView recyclerView = (RecyclerView) contentView;
RecyclerViewOnScrollListener listener = new RecyclerViewOnScrollListener(onScrollBottomListener);
recyclerView.addOnScrollListener(listener);
recyclerView.addOnItemTouchListener(listener);
}
/**
* 滑动监听
*/
private static class RecyclerViewOnScrollListener extends RecyclerView.OnScrollListener implements RecyclerView.OnItemTouchListener {
private OnScrollBottomListener onScrollBottomListener;
public RecyclerViewOnScrollListener(OnScrollBottomListener onScrollBottomListener) {
super();
this.onScrollBottomListener = onScrollBottomListener;
}
@Override
public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
if (newState == RecyclerView.SCROLL_STATE_IDLE) {
if (onScrollBottomListener != null) {
//(endY < startY) 如果放开的位置比按下去的位置大,说明手势向上移动。(之所以加这个判断是因为,之前列表数据较少的时候它已经在列表底部了,向下的刷新动作也可能触发)
//isScollBottom是否滚动到列表底部
if ((endY >= 0 && endY < startY) && isScollBottom(recyclerView)) {
onScrollBottomListener.onScorllBootom();
}
}
}
}
private boolean isScollBottom(RecyclerView recyclerView) {
return !isCanScollVertically(recyclerView);
}
private boolean isCanScollVertically(RecyclerView recyclerView) {
if (android.os.Build.VERSION.SDK_INT < 14) {
return ViewCompat.canScrollVertically(recyclerView, 1) || recyclerView.getScrollY() < recyclerView.getHeight();
} else {
return ViewCompat.canScrollVertically(recyclerView, 1);
}
}
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
}
@Override
public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) {
switch (e.getAction()) {
case MotionEvent.ACTION_DOWN:
endY = -1;
startY = e.getY();
break;
case MotionEvent.ACTION_UP:
endY = e.getY();
break;
}
return false;
}
private float startY = -1f;
private float endY = -1f;
@Override
public void onTouchEvent(RecyclerView rv, MotionEvent e) {
}
@Override
public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) {
}
}
private static class RecyclerViewFootViewAdder implements FootViewAdder {
private RecyclerView recyclerView;
private HFAdapter hfAdapter;
public RecyclerViewFootViewAdder(RecyclerView recyclerView, HFAdapter hfAdapter) {
super();
this.recyclerView = recyclerView;
this.hfAdapter = hfAdapter;
}
@Override
public View addFootView(int layoutId) {
View view = LayoutInflater.from(recyclerView.getContext()).inflate(layoutId, recyclerView, false);
return addFootView(view);
}
@Override
public View addFootView(View view) {
hfAdapter.addFooter(view);
return view;
}
@Override
public View getContentView() {
return recyclerView;
}
}
}