| 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(); | 
|     } | 
| } |