Skip to content

Commit

Permalink
修复了staggrid无法跨列的问题
Browse files Browse the repository at this point in the history
  • Loading branch information
kale committed May 9, 2016
1 parent 4df9e4d commit cc58216
Show file tree
Hide file tree
Showing 3 changed files with 65 additions and 70 deletions.
1 change: 1 addition & 0 deletions adapter/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -13,4 +13,5 @@ android {
dependencies {
provided 'com.android.databinding:baseLibrary:1.0'
provided 'com.android.support:recyclerview-v7:23.2.1'
provided "org.projectlombok:lombok:1.12.6"
}
128 changes: 60 additions & 68 deletions adapter/src/main/java/kale/adapter/RcvAdapterWrapper.java
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@
import android.view.View;
import android.view.ViewGroup;

import lombok.Getter;

/**
* @author Jack Tony
* @date 2015/6/2
Expand All @@ -20,13 +22,16 @@ public class RcvAdapterWrapper extends RecyclerView.Adapter<RecyclerView.ViewHol

public static final int TYPE_FOOTER = 99931;

private final RecyclerView.LayoutManager mLayoutManager;
@Getter
private final RecyclerView.LayoutManager layoutManager;

private RecyclerView.Adapter mWrapped;

protected View mHeaderView = null;
@Getter
private View headerView = null;

protected View mFooterView = null;
@Getter
private View footerView = null;

public RcvAdapterWrapper(@NonNull RecyclerView.Adapter adapter, @NonNull RecyclerView.LayoutManager layoutManager) {
mWrapped = adapter;
Expand Down Expand Up @@ -62,30 +67,33 @@ public void onItemRangeMoved(int fromPosition, int toPosition, int itemCount) {
notifyItemMoved(fromPosition + getHeaderCount(), getHeaderCount() + toPosition);
}
});
mLayoutManager = layoutManager;
this.layoutManager = layoutManager;

if (mLayoutManager instanceof GridLayoutManager) {
LayoutParamsSpan.setSpanSizeLookup(this, (GridLayoutManager) mLayoutManager); // 设置头部和尾部都是跨列的
if (this.layoutManager instanceof GridLayoutManager) {
setSpanSizeLookup(this, (GridLayoutManager) this.layoutManager); // 设置头部和尾部都是跨列的
}
}

/**
* @return The total number of items in this adapter.
*/
@Override
public int getItemCount() {
int offset = 0;
if (mHeaderView != null) {
if (headerView != null) {
offset++;
}
if (mFooterView != null) {
if (footerView != null) {
offset++;
}
return offset + mWrapped.getItemCount();
}

@Override
public int getItemViewType(int position) {
if (mHeaderView != null && position == 0) {
if (headerView != null && position == 0) {
return TYPE_HEADER;
} else if (mFooterView != null && position == getItemCount() - 1) {
} else if (footerView != null && position == getItemCount() - 1) {
return TYPE_FOOTER;
} else {
return mWrapped.getItemViewType(position - getHeaderCount());
Expand All @@ -95,9 +103,9 @@ public int getItemViewType(int position) {
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
if (viewType == TYPE_HEADER) {
return new SimpleViewHolder(mHeaderView);
return new SimpleViewHolder(headerView);
} else if (viewType == TYPE_FOOTER) {
return new SimpleViewHolder(mFooterView);
return new SimpleViewHolder(footerView);
} else {
return mWrapped.onCreateViewHolder(parent, viewType);
}
Expand All @@ -120,26 +128,28 @@ public void onBindViewHolder(final RecyclerView.ViewHolder viewHolder, int posit
///////////////////////////////////////////////////////////////////////////

public void setHeaderView(@NonNull View headerView) {
mHeaderView = headerView;
setSpanView(mHeaderView);
this.headerView = headerView;
setFullSpan(headerView, layoutManager);
}

public void setFooterView(@NonNull View footerView) {
mFooterView = footerView;
setSpanView(mFooterView);
this.footerView = footerView;
setFullSpan(footerView, layoutManager);
}

public View getHeaderView() {
return mHeaderView;
}
private void setFullSpan(View view, RecyclerView.LayoutManager layoutManager) {
final int itemHeight = view.getLayoutParams() != null ?
view.getLayoutParams().height : ViewGroup.LayoutParams.WRAP_CONTENT;

public View getFooterView() {
return mFooterView;
}
if (layoutManager instanceof StaggeredGridLayoutManager) {
StaggeredGridLayoutManager.LayoutParams layoutParams = new StaggeredGridLayoutManager.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT, itemHeight);
layoutParams.setFullSpan(true);
view.setLayoutParams(layoutParams);
} else if (layoutManager instanceof GridLayoutManager) {
view.setLayoutParams(new ViewGroup.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT, itemHeight));

private void setSpanView(View footerView) {
if (mLayoutManager instanceof StaggeredGridLayoutManager) {
LayoutParamsSpan.setFulSpanLayoutParams(footerView);
}
notifyDataSetChanged();
}
Expand All @@ -148,15 +158,15 @@ private void setSpanView(View footerView) {
* notifyItemRemoved(0);如果这里需要做头部的删除动画,
*/
public void removeHeaderView() {
mHeaderView = null;
headerView = null;
notifyDataSetChanged();
}

/**
* 这里因为删除尾部不会影响到前面的pos的改变,所以不用刷新
*/
public void removeFooterView() {
mFooterView = null;
footerView = null;
int footerPos = getItemCount();
notifyItemRemoved(footerPos);
}
Expand All @@ -166,58 +176,40 @@ public RecyclerView.Adapter getWrappedAdapter() {
}

public int getHeaderCount() {
return mHeaderView != null ? 1 : 0;
return headerView != null ? 1 : 0;
}

public int getFooterCount() {
return mFooterView != null ? 1 : 0;
return footerView != null ? 1 : 0;
}

public RecyclerView.LayoutManager getLayoutManager() {
return mLayoutManager;
/**
* 设置头和底部的跨列
*/
static void setSpanSizeLookup(final RecyclerView.Adapter adapter, final GridLayoutManager layoutManager) {
layoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
@Override
public int getSpanSize(int position) {
final int type = adapter.getItemViewType(position);
if (type == RcvAdapterWrapper.TYPE_HEADER || type == RcvAdapterWrapper.TYPE_FOOTER) {
// 如果是头部和底部,那么就横跨
return layoutManager.getSpanCount();
} else {
// 如果是普通的,那么就保持原样
//return layoutManager.getSpanSizeLookup().getSpanSize(position - adapter.getHeaderCount());
return 1;
}
}
});
}

/**
* Keep it simple!
*/
private static class SimpleViewHolder extends RecyclerView.ViewHolder {

public SimpleViewHolder(View itemView) {
super(itemView);
final int itemHeight = itemView.getLayoutParams() != null ?
itemView.getLayoutParams().height : ViewGroup.LayoutParams.WRAP_CONTENT;

itemView.setLayoutParams(new ViewGroup.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT,
itemHeight
));
}
}

/**
* 设置头和底部的跨列的工具类
*/
public static class LayoutParamsSpan {

public static void setFulSpanLayoutParams(View view) {
StaggeredGridLayoutManager.LayoutParams layoutParams = new StaggeredGridLayoutManager.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
layoutParams.setFullSpan(true);
view.setLayoutParams(layoutParams);
}

public static void setSpanSizeLookup(final RcvAdapterWrapper adapter, final GridLayoutManager layoutManager) {
layoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
@Override
public int getSpanSize(int position) {
final int type = adapter.getItemViewType(position);
if (type == RcvAdapterWrapper.TYPE_HEADER || type == RcvAdapterWrapper.TYPE_FOOTER) {
// 如果是头部和底部,那么就横跨
return layoutManager.getSpanCount();
} else {
// 如果是普通的,那么就保持原样
//return layoutManager.getSpanSizeLookup().getSpanSize(position - adapter.getHeaderCount());
return 1;
}
}
});
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
import android.support.v7.widget.GridLayoutManager;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.StaggeredGridLayoutManager;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
Expand Down Expand Up @@ -42,6 +43,7 @@ protected void onCreate(Bundle savedInstanceState) {

LinearLayoutManager layoutManager = new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false);
GridLayoutManager layoutManager1 = new GridLayoutManager(this, 2);
StaggeredGridLayoutManager layoutManager2 = new StaggeredGridLayoutManager(2, StaggeredGridLayoutManager.VERTICAL);
recyclerView.setLayoutManager(layoutManager1);

data.addAll(DataManager.loadData(getBaseContext()));
Expand All @@ -68,7 +70,7 @@ public AdapterItem createItem(Object type) {
}
};

final RcvAdapterWrapper wrapper = new RcvAdapterWrapper(adapter, layoutManager1);
final RcvAdapterWrapper wrapper = new RcvAdapterWrapper(adapter, recyclerView.getLayoutManager());

Button header = new Button(this);
header.setText("Header");
Expand Down Expand Up @@ -99,7 +101,7 @@ public void onItemClick(AdapterView<?> parent, View view, int position, long id)
@Override
public void run() {
data.clear();
data.addAll(DataManager.loadData(getBaseContext(),10));
data.addAll(DataManager.loadData(getBaseContext(), 10));
}
}, 1000);
}
Expand Down

0 comments on commit cc58216

Please sign in to comment.