下面列出了android.support.v7.widget.GridLayoutManager#SpanSizeLookup ( ) 实例代码,或者点击链接到github查看源代码,也可以在右侧发表评论。
public static void onAttachedToRecyclerView(RecyclerView.Adapter innerAdapter, RecyclerView recyclerView, final SpanSizeCallback callback) {
innerAdapter.onAttachedToRecyclerView(recyclerView);
RecyclerView.LayoutManager layoutManager = recyclerView.getLayoutManager();
if (layoutManager instanceof GridLayoutManager) {
final GridLayoutManager gridLayoutManager = (GridLayoutManager) layoutManager;
final GridLayoutManager.SpanSizeLookup spanSizeLookup = gridLayoutManager.getSpanSizeLookup();
gridLayoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
@Override
public int getSpanSize(int position) {
return callback.getSpanSize(gridLayoutManager, spanSizeLookup, position);
}
});
gridLayoutManager.setSpanCount(gridLayoutManager.getSpanCount());
}
}
public void useGridMode(int spanCount) {
setGridSpanCount(spanCount);
setLayoutManager(new GridLayoutManager(getContext(), spanCount));
GridLayoutManager.SpanSizeLookup spanSizeLookup = new GridLayoutManager.SpanSizeLookup() {
@Override
public int getSpanSize(int position) {
try {
return adapter.getCell(position).getSpanSize();
} catch (Exception e) {
return 1;
}
}
};
spanSizeLookup.setSpanIndexCacheEnabled(true);
((GridLayoutManager) getLayoutManager()).setSpanSizeLookup(spanSizeLookup);
}
public static void onAttachedToRecyclerView(RecyclerView.Adapter innerAdapter, RecyclerView recyclerView, final SpanSizeCallback callback)
{
innerAdapter.onAttachedToRecyclerView(recyclerView);
RecyclerView.LayoutManager layoutManager = recyclerView.getLayoutManager();
if (layoutManager instanceof GridLayoutManager)
{
final GridLayoutManager gridLayoutManager = (GridLayoutManager) layoutManager;
final GridLayoutManager.SpanSizeLookup spanSizeLookup = gridLayoutManager.getSpanSizeLookup();
gridLayoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup()
{
@Override
public int getSpanSize(int position)
{
return callback.getSpanSize(gridLayoutManager, spanSizeLookup, position);
}
});
gridLayoutManager.setSpanCount(gridLayoutManager.getSpanCount());
}
}
public static void onAttachedToRecyclerView(RecyclerView.Adapter innerAdapter, RecyclerView recyclerView, final SpanSizeCallback callback)
{
innerAdapter.onAttachedToRecyclerView(recyclerView);
RecyclerView.LayoutManager layoutManager = recyclerView.getLayoutManager();
if (layoutManager instanceof GridLayoutManager)
{
final GridLayoutManager gridLayoutManager = (GridLayoutManager) layoutManager;
final GridLayoutManager.SpanSizeLookup spanSizeLookup = gridLayoutManager.getSpanSizeLookup();
gridLayoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup()
{
@Override
public int getSpanSize(int position)
{
return callback.getSpanSize(gridLayoutManager, spanSizeLookup, position);
}
});
gridLayoutManager.setSpanCount(gridLayoutManager.getSpanCount());
}
}
@Override
public void setLayoutManager(LayoutManager layoutManager) {
if (layoutManager instanceof GridLayoutManager) {
final GridLayoutManager gridLayoutManager = (GridLayoutManager)layoutManager;
final GridLayoutManager.SpanSizeLookup spanSizeLookupHolder = gridLayoutManager.getSpanSizeLookup();
gridLayoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
@Override
public int getSpanSize(int position) {
if (mAdapterWrapper.isHeader(position) || mAdapterWrapper.isFooter(position)) {
return gridLayoutManager.getSpanCount();
}
if (spanSizeLookupHolder != null) {
return spanSizeLookupHolder.getSpanSize(position - getHeaderCount());
}
return 1;
}
});
}
super.setLayoutManager(layoutManager);
}
public static void onAttachedToRecyclerView(RecyclerView.Adapter innerAdapter, RecyclerView recyclerView, final SpanSizeCallback callback)
{
innerAdapter.onAttachedToRecyclerView(recyclerView);
RecyclerView.LayoutManager layoutManager = recyclerView.getLayoutManager();
if (layoutManager instanceof GridLayoutManager)
{
final GridLayoutManager gridLayoutManager = (GridLayoutManager) layoutManager;
final GridLayoutManager.SpanSizeLookup spanSizeLookup = gridLayoutManager.getSpanSizeLookup();
gridLayoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup()
{
@Override
public int getSpanSize(int position)
{
return callback.getSpanSize(gridLayoutManager, spanSizeLookup, position);
}
});
gridLayoutManager.setSpanCount(gridLayoutManager.getSpanCount());
}
}
protected boolean isLastRaw(int pos) {
if (mChildCount <= 0) {
return false;
}
GridLayoutManager.SpanSizeLookup lookup = mManager.getSpanSizeLookup();
return lookup.getSpanGroupIndex(pos, mSpanCount) == lookup.getSpanGroupIndex(mChildCount - 1, mSpanCount);
}
/**
* Returns a group index for GridLayoutManager.
* for LinearLayoutManager, always returns position.
*
* @param position current view position to draw divider
* @param parent RecyclerView
* @return group index of items
*/
private int getGroupIndex(int position, RecyclerView parent) {
if (parent.getLayoutManager() instanceof GridLayoutManager) {
GridLayoutManager layoutManager = (GridLayoutManager) parent.getLayoutManager();
GridLayoutManager.SpanSizeLookup spanSizeLookup = layoutManager.getSpanSizeLookup();
int spanCount = layoutManager.getSpanCount();
return spanSizeLookup.getSpanGroupIndex(position, spanCount);
}
return position;
}
/**
* This method unsubscribe observer and change listeners reference to null
* for avoid memory leaks.
*/
@Deprecated
public void unbind() {
if (recyclerView.getLayoutManager() instanceof LinearLayoutManager) {
wrapperAdapter.unbind();
userAdapter.unregisterAdapterDataObserver(wrapperAdapterObserver);
recyclerView.setAdapter(userAdapter);
} else if (recyclerView.getLayoutManager() instanceof GridLayoutManager && wrapperSpanSizeLookup != null) {
GridLayoutManager.SpanSizeLookup spanSizeLookup = wrapperSpanSizeLookup.getWrappedSpanSizeLookup();
((GridLayoutManager) recyclerView.getLayoutManager()).setSpanSizeLookup(spanSizeLookup);
}
}
/**
* This method unsubscribe observer and change listeners reference to null
* for avoid memory leaks.
*/
public void unbind() {
recyclerView.removeOnScrollListener(scrollListener);
if (recyclerView.getLayoutManager() instanceof LinearLayoutManager) {
wrapperAdapter.unbind();
userAdapter.unregisterAdapterDataObserver(wrapperAdapterObserver);
recyclerView.setAdapter(userAdapter);
} else if (recyclerView.getLayoutManager() instanceof GridLayoutManager && wrapperSpanSizeLookup != null) {
GridLayoutManager.SpanSizeLookup spanSizeLookup = wrapperSpanSizeLookup.getWrappedSpanSizeLookup();
((GridLayoutManager) recyclerView.getLayoutManager()).setSpanSizeLookup(spanSizeLookup);
}
}
public WrapperSpanSizeLookup(GridLayoutManager.SpanSizeLookup gridSpanSizeLookup,
BaseGridLayoutManagerItem loadingListItemSpanLookup,
WrapperAdapter wrapperAdapter) {
this.wrappedSpanSizeLookup = gridSpanSizeLookup;
this.loadingListItemSpanLookup = loadingListItemSpanLookup;
this.wrapperAdapter = wrapperAdapter;
}
public GridLayoutManager.SpanSizeLookup spanSizeLookup(int headerSpan, int footerSpan) {
return new AdapterSpanSizeLookup(headerSpan, footerSpan);
}
int getSpanSize(GridLayoutManager layoutManager, GridLayoutManager.SpanSizeLookup
oldLookup, int position);
public GridLayoutManager.SpanSizeLookup getWrapper() {
return wrapper;
}
public void setSpanSizeLookup(GridLayoutManager.SpanSizeLookup spanSizeLookup) {
manager.setSpanSizeLookup(spanSizeLookup);
}
/**
* 设置某个位置的item的跨列程度,这里和GridLayoutManager有点不一样,
* 如果你设置某个位置的item的span>1了,那么这个item会占据所有列
*
* @param spanSizeLookup instance to be used to query number of spans
* occupied by each item
*/
public void setSpanSizeLookup(GridLayoutManager.SpanSizeLookup spanSizeLookup) {
mSpanSizeLookup = spanSizeLookup;
}
public void setSpanSizeLookup(GridLayoutManager.SpanSizeLookup spanSizeLookup) {
mSpanSizeLookup = spanSizeLookup;
}
int getSpanSize(GridLayoutManager layoutManager, GridLayoutManager.SpanSizeLookup oldLookup, int position);
int getSpanSize(GridLayoutManager layoutManager, GridLayoutManager.SpanSizeLookup oldLookup, int position);
int getSpanSize(GridLayoutManager layoutManager, GridLayoutManager.SpanSizeLookup oldLookup, int position);