package cn.sinata.xldutils.view;
|
|
import android.content.Context;
|
import android.graphics.Color;
|
import android.util.AttributeSet;
|
import android.util.TypedValue;
|
import android.view.Gravity;
|
import android.view.View;
|
import android.view.ViewGroup;
|
import android.widget.TextView;
|
|
import androidx.recyclerview.widget.LinearLayoutManager;
|
import androidx.recyclerview.widget.RecyclerView;
|
import androidx.recyclerview.widget.StaggeredGridLayoutManager;
|
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout;
|
|
import cn.sinata.xldutils.R;
|
import cn.sinata.xldutils.adapter.HFRecyclerAdapter;
|
import cn.sinata.xldutils.utils.DensityUtil;
|
|
/**
|
*
|
* Created by liaoxiang on 16/3/28.
|
*/
|
public class SwipeRefreshRecyclerLayout extends SwipeRefreshLayout implements SwipeRefreshLayout.OnRefreshListener {
|
private RecyclerView mRecyclerView;
|
private TextView loadMoreView;
|
private RecyclerView.Adapter mAdapter;
|
private boolean isLoadMore = false;
|
private Mode mode = Mode.Both;
|
private OnRefreshListener onRefreshListener;
|
private int lastVisibleItem = 0;
|
private int[] lastPositions ;
|
|
public SwipeRefreshRecyclerLayout(Context context) {
|
super(context);
|
init();
|
}
|
|
public SwipeRefreshRecyclerLayout(Context context, AttributeSet attrs) {
|
super(context, attrs);
|
init();
|
}
|
|
void init(){
|
mRecyclerView = new RecyclerView(getContext());
|
mRecyclerView.setHasFixedSize(true);
|
mRecyclerView.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT,LayoutParams.MATCH_PARENT));
|
|
addView(mRecyclerView);
|
setOnRefreshListener(this);
|
}
|
|
private RecyclerView.OnScrollListener onScrollListener = new RecyclerView.OnScrollListener() {
|
@Override
|
public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
|
super.onScrollStateChanged(recyclerView, newState);
|
RecyclerView.Adapter adapter =recyclerView.getAdapter();
|
resetLastVisibleItem();
|
if (newState == RecyclerView.SCROLL_STATE_IDLE && adapter != null
|
&& lastVisibleItem + 1 == adapter.getItemCount() && !isRefreshing() && !isLoadMore) {
|
if (adapter instanceof HFRecyclerAdapter){
|
|
if (loadMoreView!=null ){
|
loadMoreView.setText("载入更多...");
|
loadMoreView.setVisibility(View.VISIBLE);
|
}
|
isLoadMore = true;
|
if (onRefreshListener!=null){
|
onRefreshListener.onLoadMore();
|
}
|
}
|
}
|
}
|
};
|
|
public RecyclerView getRecyclerView(){
|
return mRecyclerView;
|
}
|
|
public void setAdapter(RecyclerView.Adapter adapter){
|
mAdapter = adapter;
|
mRecyclerView.setAdapter(mAdapter);
|
if (mode == Mode.Both){
|
initLoadMore();
|
}
|
}
|
|
public void setLayoutManager(RecyclerView.LayoutManager layoutManager){
|
mRecyclerView.setLayoutManager(layoutManager);
|
}
|
|
public void addItemDecoration(RecyclerView.ItemDecoration itemDecoration){
|
mRecyclerView.addItemDecoration(itemDecoration);
|
}
|
|
public void setOnRefreshListener(OnRefreshListener onRefreshListener){
|
this.onRefreshListener = onRefreshListener;
|
}
|
|
public void setMode(Mode mode){
|
this.mode = mode;
|
if (mode == Mode.Both){
|
mRecyclerView.addOnScrollListener(onScrollListener);
|
initLoadMore();
|
}else {
|
mRecyclerView.removeOnScrollListener(onScrollListener);
|
}
|
}
|
|
private void initLoadMore(){
|
if (mAdapter instanceof HFRecyclerAdapter) {
|
if (loadMoreView!=null){
|
return;
|
}
|
loadMoreView = new TextView(getContext());
|
loadMoreView.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT));
|
// loadMoreView.setHeight(DensityUtil.dip2px(this,48));
|
loadMoreView.setBackgroundColor(Color.WHITE);
|
loadMoreView.setText("载入更多...");
|
loadMoreView.setTextSize(TypedValue.COMPLEX_UNIT_SP, 14);
|
loadMoreView.setTextColor(getResources().getColor(R.color.textColor));
|
loadMoreView.setGravity(Gravity.CENTER);
|
loadMoreView.setPadding(0, DensityUtil.dip2px(getContext(), 16), 0, DensityUtil.dip2px(getContext(), 16));
|
((HFRecyclerAdapter) mAdapter).setFooterView(loadMoreView);
|
}
|
}
|
|
public void setLoadMoreText(CharSequence text){
|
if (loadMoreView!=null){
|
loadMoreView.setText(text);
|
if (loadMoreView.getVisibility() != View.VISIBLE){
|
loadMoreView.setVisibility(View.VISIBLE);
|
}
|
}
|
}
|
|
/**
|
* 重新获取可见item的位置
|
*/
|
private void resetLastVisibleItem(){
|
RecyclerView.LayoutManager layoutManager = mRecyclerView.getLayoutManager();
|
if (layoutManager != null && layoutManager instanceof LinearLayoutManager) {
|
lastVisibleItem = ((LinearLayoutManager) layoutManager).findLastVisibleItemPosition();
|
}else if (layoutManager!=null && layoutManager instanceof StaggeredGridLayoutManager){
|
StaggeredGridLayoutManager staggeredGridLayoutManager =((StaggeredGridLayoutManager) layoutManager);
|
if (lastPositions == null) {
|
lastPositions = new int[staggeredGridLayoutManager.getSpanCount()];
|
}
|
staggeredGridLayoutManager.findLastVisibleItemPositions(lastPositions);
|
lastVisibleItem = findMax(lastPositions);
|
}
|
}
|
|
private int findMax(int[] lastPositions) {
|
int max = lastPositions[0];
|
for (int value : lastPositions) {
|
if (value > max) {
|
max = value;
|
}
|
}
|
return max;
|
}
|
|
@Override
|
public void onRefresh() {
|
if (onRefreshListener!=null){
|
onRefreshListener.onRefresh();
|
}
|
}
|
|
/**
|
* 设置刷新状态
|
* @param refreshing 刷新状态
|
*/
|
@Override
|
public void setRefreshing(boolean refreshing){
|
super.setRefreshing(refreshing);
|
this.isLoadMore = refreshing;
|
if (loadMoreView!=null ){
|
loadMoreView.setVisibility(View.GONE);
|
}
|
}
|
|
public enum Mode{
|
Both,Top
|
}
|
|
public interface OnRefreshListener {
|
void onRefresh();
|
void onLoadMore();
|
}
|
}
|