Skip to content

Commit

Permalink
修复多个header时,header乱序的问题
Browse files Browse the repository at this point in the history
  • Loading branch information
Damonzh committed Apr 12, 2016
1 parent 26108f3 commit 2dde636
Showing 1 changed file with 62 additions and 47 deletions.
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package com.jcodecraeer.xrecyclerview;

import java.util.ArrayList;
import java.util.List;

import android.content.Context;
import android.support.v7.widget.GridLayoutManager;
Expand All @@ -12,10 +13,11 @@
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Adapter;

public class XRecyclerView extends RecyclerView {

private Context mContext;
private Context mContext;
private boolean isLoadingData = false;
private boolean isnomore = false;
private int mRefreshProgressStyle = ProgressStyle.SysProgress;
Expand All @@ -30,10 +32,11 @@ public class XRecyclerView extends RecyclerView {
private ArrowRefreshHeader mRefreshHeader;
private boolean pullRefreshEnabled = true;
private boolean loadingMoreEnabled = true;
private static final int TYPE_REFRESH_HEADER = -5;
private static final int TYPE_HEADER = -4;
private static final int TYPE_NORMAL = 0;
private static final int TYPE_FOOTER = -3;
private static final int TYPE_REFRESH_HEADER = -5;
private static final int TYPE_NORMAL = 0;
private static final int TYPE_FOOTER = -3;
private static final int HEADER_INIT_INDEX = 10000;
private static List<Integer> sHeaderTypes = new ArrayList<>();
private int previousTotal = 0;
private int mPageCount = 0;
//adapter没有数据的时候显示,类似于listView的emptyView
Expand All @@ -54,7 +57,7 @@ public XRecyclerView(Context context, AttributeSet attrs, int defStyle) {

private void init(Context context) {
mContext = context;
if(pullRefreshEnabled) {
if (pullRefreshEnabled) {
ArrowRefreshHeader refreshHeader = new ArrowRefreshHeader(mContext);
mHeaderViews.add(0, refreshHeader);
mRefreshHeader = refreshHeader;
Expand All @@ -74,6 +77,7 @@ public void addHeaderView(View view) {
mRefreshHeader.setProgressStyle(mRefreshProgressStyle);
}
mHeaderViews.add(view);
sHeaderTypes.add(HEADER_INIT_INDEX + mHeaderViews.size());
}

public void addFootView(final View view) {
Expand All @@ -84,16 +88,16 @@ public void addFootView(final View view) {
public void loadMoreComplete() {
isLoadingData = false;
View footView = mFootViews.get(0);
if(previousTotal < getLayoutManager().getItemCount()) {
if(footView instanceof LoadingMoreFooter) {
( (LoadingMoreFooter) footView ).setState(LoadingMoreFooter.STATE_COMPLETE);
} else{
if (previousTotal < getLayoutManager().getItemCount()) {
if (footView instanceof LoadingMoreFooter) {
((LoadingMoreFooter) footView).setState(LoadingMoreFooter.STATE_COMPLETE);
} else {
footView.setVisibility(View.GONE);
}
} else {
if(footView instanceof LoadingMoreFooter) {
( (LoadingMoreFooter) footView ).setState(LoadingMoreFooter.STATE_NOMORE);
}else{
if (footView instanceof LoadingMoreFooter) {
((LoadingMoreFooter) footView).setState(LoadingMoreFooter.STATE_NOMORE);
} else {
footView.setVisibility(View.GONE);
}
isnomore = true;
Expand All @@ -105,9 +109,9 @@ public void noMoreLoading() {
isLoadingData = false;
View footView = mFootViews.get(0);
isnomore = true;
if(footView instanceof LoadingMoreFooter) {
( (LoadingMoreFooter) footView ).setState(LoadingMoreFooter.STATE_NOMORE);
}else{
if (footView instanceof LoadingMoreFooter) {
((LoadingMoreFooter) footView).setState(LoadingMoreFooter.STATE_NOMORE);
} else {
footView.setVisibility(View.GONE);
}
}
Expand All @@ -116,17 +120,17 @@ public void refreshComplete() {
mRefreshHeader.refreshComplate();
}

public void setRefreshHeader(ArrowRefreshHeader refreshHeader){
public void setRefreshHeader(ArrowRefreshHeader refreshHeader) {
mRefreshHeader = refreshHeader;
}

public void setPullRefreshEnabled(boolean enabled){
public void setPullRefreshEnabled(boolean enabled) {
pullRefreshEnabled = enabled;
}

public void setLoadingMoreEnabled(boolean enabled){
public void setLoadingMoreEnabled(boolean enabled) {
loadingMoreEnabled = enabled;
if(!enabled) {
if (!enabled) {
if (mFootViews.size() > 0) {
mFootViews.get(0).setVisibility(GONE);
}
Expand All @@ -135,20 +139,20 @@ public void setLoadingMoreEnabled(boolean enabled){

public void setRefreshProgressStyle(int style) {
mRefreshProgressStyle = style;
if (mRefreshHeader != null){
if (mRefreshHeader != null) {
mRefreshHeader.setProgressStyle(style);
}
}

public void setLoadingMoreProgressStyle(int style) {
mLoadingMoreProgressStyle = style;
if(mFootViews.size() > 0 && mFootViews.get(0) instanceof LoadingMoreFooter){
if (mFootViews.size() > 0 && mFootViews.get(0) instanceof LoadingMoreFooter) {
((LoadingMoreFooter) mFootViews.get(0)).setProgressStyle(style);
}
}

public void setArrowImageView(int resid) {
if (mRefreshHeader != null){
if (mRefreshHeader != null) {
mRefreshHeader.setArrowImageView(resid);
}
}
Expand All @@ -164,7 +168,7 @@ public View getEmptyView() {

@Override
public void setAdapter(Adapter adapter) {
mAdapter = adapter;
mAdapter = adapter;
mWrapAdapter = new WrapAdapter(mHeaderViews, mFootViews, adapter);
super.setAdapter(mWrapAdapter);
mAdapter.registerAdapterDataObserver(mDataObserver);
Expand All @@ -188,13 +192,13 @@ public void onScrollStateChanged(int state) {
lastVisibleItemPosition = ((LinearLayoutManager) layoutManager).findLastVisibleItemPosition();
}
if (layoutManager.getChildCount() > 0
&& lastVisibleItemPosition >= layoutManager.getItemCount() - 1 && layoutManager.getItemCount() > layoutManager.getChildCount() && !isnomore && mRefreshHeader.getState() < ArrowRefreshHeader.STATE_REFRESHING) {
&& lastVisibleItemPosition >= layoutManager.getItemCount() - 1 && layoutManager.getItemCount() > layoutManager.getChildCount() && !isnomore && mRefreshHeader.getState() < ArrowRefreshHeader.STATE_REFRESHING) {

View footView = mFootViews.get(0);
isLoadingData = true;
if(footView instanceof LoadingMoreFooter) {
( (LoadingMoreFooter) footView ).setState(LoadingMoreFooter.STATE_LOADING);
} else{
if (footView instanceof LoadingMoreFooter) {
((LoadingMoreFooter) footView).setState(LoadingMoreFooter.STATE_LOADING);
} else {
footView.setVisibility(View.VISIBLE);
}
mLoadingListener.onLoadMore();
Expand All @@ -214,19 +218,19 @@ public boolean onTouchEvent(MotionEvent ev) {
case MotionEvent.ACTION_MOVE:
final float deltaY = ev.getRawY() - mLastY;
mLastY = ev.getRawY();
if ( isOnTop() && pullRefreshEnabled) {
if (isOnTop() && pullRefreshEnabled) {
mRefreshHeader.onMove(deltaY / DRAG_RATE);
if(mRefreshHeader.getVisiableHeight() > 0 && mRefreshHeader.getState() < ArrowRefreshHeader.STATE_REFRESHING ) {
if (mRefreshHeader.getVisiableHeight() > 0 && mRefreshHeader.getState() < ArrowRefreshHeader.STATE_REFRESHING) {
Log.i("getVisiableHeight", "getVisiableHeight = " + mRefreshHeader.getVisiableHeight());
Log.i("getVisiableHeight", " mRefreshHeader.getState() = " + mRefreshHeader.getState());
Log.i("getVisiableHeight", " mRefreshHeader.getState() = " + mRefreshHeader.getState());
return false;
}
}
break;
default:
mLastY = -1; // reset
if ( isOnTop() && pullRefreshEnabled) {
if( mRefreshHeader.releaseAction()) {
if (isOnTop() && pullRefreshEnabled) {
if (mRefreshHeader.releaseAction()) {
if (mLoadingListener != null) {
mLoadingListener.onRefresh();
isnomore = false;
Expand Down Expand Up @@ -350,21 +354,21 @@ private class WrapAdapter extends RecyclerView.Adapter<ViewHolder> {

public WrapAdapter(ArrayList<View> headerViews, ArrayList<View> footViews, RecyclerView.Adapter adapter) {
this.adapter = adapter;
this.mHeaderViews = headerViews;
this.mFootViews = footViews;
this.mHeaderViews = headerViews;
this.mFootViews = footViews;
}

@Override
public void onAttachedToRecyclerView(RecyclerView recyclerView) {
super.onAttachedToRecyclerView(recyclerView);
RecyclerView.LayoutManager manager = recyclerView.getLayoutManager();
if(manager instanceof GridLayoutManager) {
if (manager instanceof GridLayoutManager) {
final GridLayoutManager gridManager = ((GridLayoutManager) manager);
gridManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
@Override
public int getSpanSize(int position) {
return (isHeader(position)|| isFooter(position))
? gridManager.getSpanCount() : 1;
return (isHeader(position) || isFooter(position))
? gridManager.getSpanCount() : 1;
}
});
}
Expand All @@ -374,9 +378,9 @@ public int getSpanSize(int position) {
public void onViewAttachedToWindow(RecyclerView.ViewHolder holder) {
super.onViewAttachedToWindow(holder);
ViewGroup.LayoutParams lp = holder.itemView.getLayoutParams();
if(lp != null
if (lp != null
&& lp instanceof StaggeredGridLayoutManager.LayoutParams
&& (isHeader( holder.getLayoutPosition()) || isFooter( holder.getLayoutPosition())) ) {
&& (isHeader(holder.getLayoutPosition()) || isFooter(holder.getLayoutPosition()))) {
StaggeredGridLayoutManager.LayoutParams p = (StaggeredGridLayoutManager.LayoutParams) lp;
p.setFullSpan(true);
}
Expand All @@ -386,12 +390,16 @@ public boolean isHeader(int position) {
return position >= 0 && position < mHeaderViews.size();
}

public boolean isContentHeader(int position) {
return position >= 1 && position < mHeaderViews.size();
}

public boolean isFooter(int position) {
return position < getItemCount() && position >= getItemCount() - mFootViews.size();
}

public boolean isRefreshHeader(int position) {
return position == 0 ;
return position == 0;
}

public int getHeadersCount() {
Expand All @@ -405,15 +413,21 @@ public int getFootersCount() {
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
if (viewType == TYPE_REFRESH_HEADER) {
mCurrentPosition++;
return new SimpleViewHolder(mHeaderViews.get(0));
} else if (viewType == TYPE_HEADER) {
return new SimpleViewHolder(mHeaderViews.get(headerPosition++ ));
} else if (isContentHeader(mCurrentPosition)) {
if (viewType == sHeaderTypes.get(mCurrentPosition - 1)) {
mCurrentPosition++;
return new SimpleViewHolder(mHeaderViews.get(headerPosition++));
}
} else if (viewType == TYPE_FOOTER) {
return new SimpleViewHolder(mFootViews.get(0));
}
return adapter.onCreateViewHolder(parent, viewType);
}

private int mCurrentPosition;

@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
if (isHeader(position)) {
Expand Down Expand Up @@ -441,13 +455,14 @@ public int getItemCount() {

@Override
public int getItemViewType(int position) {
if(isRefreshHeader(position)){
if (isRefreshHeader(position)) {
return TYPE_REFRESH_HEADER;
}
if (isHeader(position)) {
return TYPE_HEADER;
position = position - 1;
return sHeaderTypes.get(position);
}
if(isFooter(position)){
if (isFooter(position)) {
return TYPE_FOOTER;
}
int adjPosition = position - getHeadersCount();
Expand Down Expand Up @@ -504,7 +519,7 @@ public interface LoadingListener {

void onLoadMore();
}

public void setRefreshing(boolean refreshing) {
if (refreshing && pullRefreshEnabled && mLoadingListener != null) {
mRefreshHeader.setState(ArrowRefreshHeader.STATE_REFRESHING);
Expand Down

0 comments on commit 2dde636

Please sign in to comment.