浅谈RecycleView使用

来源:互联网 发布:linux transmission 编辑:程序博客网 时间:2024/06/05 20:28


随着google推出recycleview这个控件,listview 、gridview等控件也就几乎没有存在的意义了,但是recycleview还是有一部分坑需要填的,下面我将我遇到的问题与大家分享一下

:

一、recycleview加头加脚:

package com.xiaobai.mizar.android.ui.adapter;import android.content.Context;import android.os.Message;import android.support.v7.widget.RecyclerView;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.TextView;import com.xiaobai.mizar.utils.Logger;import com.base.view.RotateLoading;import com.lidroid.xutils.ViewUtils;import com.lidroid.xutils.view.annotation.ViewInject;import com.xiaobai.mizar.R;import com.xiaobai.mizar.utils.TaskHandler;import java.util.ArrayList;import java.util.List;/** * A RecyclerView.Adapter that allows for headers and footers as well. * <p/> * This class wraps a base adapter that's passed into the constructor. It works by creating extra view items types * that are returned in {@link #getItemViewType(int)}, and mapping these to the header and footer views provided via * {@link #addHeader(View)} and {@link #addFooter(View)}. * <p/> * There are two restrictions when using this class: * <p/> * 1) The base adapter can't use negative view types, since this class uses negative view types to keep track * of header and footer views. * <p/> * 2) You can't add more than 1000 headers or footers. * <p/> * Created by mlapadula on 12/15/14. */public class HeaderableAdapter<T extends RecyclerView.Adapter> extends RecyclerView.Adapter<RecyclerView.ViewHolder> {private final T mBase;/** * Defines available view type integers for headers and footers. * <p/> * How this works: * - Regular views use view types starting from 0, counting upwards * - Header views use view types starting from -1000, counting upwards * - Footer views use view types starting from -2000, counting upwards * <p/> * This means that you're safe as long as the base adapter doesn't use negative view types, * and as long as you have fewer than 1000 headers and footers */private static final int HEADER_VIEW_TYPE = -1000;private static final int FOOTER_VIEW_TYPE = -2000;private final List<View> mHeaders = new ArrayList<>();private final List<View> mFooters = new ArrayList<>();/** * Constructor. * * @param base the adapter to wrap */public HeaderableAdapter(T base) {super();mBase = base;}/** * Gets the base adapter that this is wrapping. */public T getWrappedAdapter() {return mBase;}/** * Adds a header view. */public void addHeader(View view) {if (view == null) {throw new IllegalArgumentException("You can't have a null header!");}mHeaders.add(view);}/** * Adds a footer view. */public void addFooter(View view) {if (view == null) {throw new IllegalArgumentException("You can't have a null footer!");}mFooters.add(view);}/** * walid add 2015.10.29 18:02 add  (用户设置加载脚)  start *///加载更多@ViewInject(R.id.rotateloading)RotateLoading rotateloading;@ViewInject(R.id.tvLoadMore)TextView tvLoadMore;private View loadMoreView;public void addLoadMoreFooter(Context context, RecyclerView recyclerView) {if (loadMoreView == null || mFooters.size() <= 0) {loadMoreView = LayoutInflater.from(context).inflate(R.layout.include_load_more, recyclerView, false);ViewUtils.inject(this, loadMoreView);mFooters.add(loadMoreView);}rotateloading.start();setFooterVisibility(false);}public boolean stopLoading() {if (rotateloading == null || tvLoadMore == null || mFooters.size() <= 0) {return false;}setFooterVisibility(false);return true;}public void startLoading() {if (loadMoreView == null || rotateloading == null || mFooters.size() <= 0) {return;}setFooterVisibility(true);}//static class LoadMoreHandler extends TaskHandler<HeaderableAdapter> {////public LoadMoreHandler(HeaderableAdapter headerableAdapter) {//super(headerableAdapter);//}////@Override//public void onTaskOk(HeaderableAdapter headerableAdapter, Message msg) {//super.onTaskOk(headerableAdapter, msg);//headerableAdapter.tvLoadMore.setClickable(true);//headerableAdapter.tvLoadMore.setTextSize(16);//}//}/**  walid add 2015.10.29 18:02 add  (用户设置加载脚)  end    *//** * Toggles the visibility of the header views. */public void setHeaderVisibility(boolean shouldShow) {for (View header : mHeaders) {header.setVisibility(shouldShow ? View.VISIBLE : View.GONE);}}/** * 删除加载更多脚 view */public void removeLoadMoreFooter() {if (loadMoreView != null && mFooters.size() > 0) {mFooters.remove(loadMoreView);} else {Logger.w("没有加载更多脚...");}}/** * Toggles the visibility of the footer views. */public void setFooterVisibility(boolean shouldShow) {for (View footer : mFooters) {footer.setVisibility(shouldShow ? View.VISIBLE : View.GONE);}}/** * @return the number of headers. */public int getHeaderCount() {return mHeaders.size();}/** * @return the number of footers. */public int getFooterCount() {return mFooters.size();}/** * Gets the indicated header, or null if it doesn't exist. */public View getHeader(int i) {return i < mHeaders.size() ? mHeaders.get(i) : null;}/** * Gets the indicated footer, or null if it doesn't exist. */public View getFooter(int i) {return i < mFooters.size() ? mFooters.get(i) : null;}public boolean isHeader(int viewType) {return viewType >= HEADER_VIEW_TYPE && viewType < (HEADER_VIEW_TYPE + mHeaders.size());}public boolean isFooter(int viewType) {return viewType >= FOOTER_VIEW_TYPE && viewType < (FOOTER_VIEW_TYPE + mFooters.size());}@Overridepublic RecyclerView.ViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) {if (isHeader(viewType)) {int whichHeader = Math.abs(viewType - HEADER_VIEW_TYPE);View headerView = mHeaders.get(whichHeader);return new RecyclerView.ViewHolder(headerView) {};} else if (isFooter(viewType)) {int whichFooter = Math.abs(viewType - FOOTER_VIEW_TYPE);View footerView = mFooters.get(whichFooter);return new RecyclerView.ViewHolder(footerView) {};} else {return mBase.onCreateViewHolder(viewGroup, viewType);}}@Overridepublic void onBindViewHolder(RecyclerView.ViewHolder viewHolder, int position) {if (position < mHeaders.size()) {// Headers don't need anything special} else if (position < mHeaders.size() + mBase.getItemCount()) {// This is a real position, not a header or footer. Bind it.mBase.onBindViewHolder(viewHolder, position - mHeaders.size());} else {// Footers don't need anything special}}@Overridepublic int getItemCount() {return mHeaders.size() + mBase.getItemCount() + mFooters.size();}public int getContentCount() {return mBase.getItemCount() + mHeaders.size();}@Overridepublic int getItemViewType(int position) {if (position < mHeaders.size()) {return HEADER_VIEW_TYPE + position;} else if (position < (mHeaders.size() + mBase.getItemCount())) {return mBase.getItemViewType(position - mHeaders.size());} else {return FOOTER_VIEW_TYPE + position - mHeaders.size() - mBase.getItemCount();}}}
1、封装了一层adapter:

package com.xiaobai.mizar.android.ui.adapter;import android.content.Context;import android.support.v7.widget.RecyclerView;import android.view.LayoutInflater;import com.xiaobai.mizar.logic.apimodels.Listable;import com.xiaobai.mizar.utils.interfaces.AdapterEventInterface;import java.io.Serializable;/** * Author: walid * Date : 2015/11/9 13:07 */public abstract class BaseXiaoBaiAdapter<VH extends RecyclerView.ViewHolder, T extends Serializable, TI extends AdapterEventInterface>extends RecyclerView.Adapter<VH> {protected Context context;protected LayoutInflater inflater;protected Listable<T> dataSet;protected TI eventInterface;public BaseXiaoBaiAdapter(Context context, Listable<T> dataSet, TI eventInterface) {this.context = context;this.dataSet = dataSet;this.eventInterface = eventInterface;inflater = LayoutInflater.from(context);}@Overridepublic int getItemCount() {return dataSet.size();}}
2、lisable接口,使用这样的接口就不用update数据时传递数据了:

package com.xiaobai.mizar.logic.apimodels;/** * 可以从model中拿到数据的接口 控制访问权限 不直接返回列表 * Created by liuwei on 15/10/17. */import java.io.Serializable;public interface Listable<T extends Serializable>{    T get(int position);    int size();}

3、adapter使用---> initParams看我屏幕适配文章就可以了,这里不是重点:

package com.xiaobai.mizar.android.ui.adapter.mine;import android.content.Context;import android.support.v7.widget.RecyclerView;import android.view.View;import android.view.ViewGroup;import com.lidroid.xutils.ViewUtils;import com.lidroid.xutils.view.ResType;import com.lidroid.xutils.view.annotation.ResInject;import com.lidroid.xutils.view.annotation.ViewInject;import com.lidroid.xutils.view.annotation.event.OnClick;import com.xiaobai.mizar.R;import com.xiaobai.mizar.android.ui.adapter.BaseXiaoBaiAdapter;import com.xiaobai.mizar.android.ui.view.XiaoBaiRelativeLayout;import com.xiaobai.mizar.android.ui.view.XiaobaiTextView;import com.xiaobai.mizar.logic.apimodels.Listable;import com.xiaobai.mizar.logic.apimodels.account.UserEventRecordVo;import com.xiaobai.mizar.utils.interfaces.AdapterEventInterface;import com.xiaobai.mizar.utils.tools.DateUtils;/** * Author: walid * Date : 2015/10/21 19:43 */public class IntengrationAdapterextends BaseXiaoBaiAdapter<IntengrationAdapter.ViewHolder, UserEventRecordVo, AdapterEventInterface<UserEventRecordVo>> {public IntengrationAdapter(Context context, Listable<UserEventRecordVo> dataList,                           AdapterEventInterface<UserEventRecordVo> intengrationAdapterEvent) {super(context, dataList, intengrationAdapterEvent);}@Overridepublic ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {View itemView = inflater.inflate(R.layout.include_intengration_item, parent, false);return new ViewHolder(itemView);}@Overridepublic void onBindViewHolder(ViewHolder viewHolder, int position) {viewHolder.position = position;UserEventRecordVo itemData = dataSet.get(position);viewHolder.tvEventTypeName.setText(itemData.getEventType());viewHolder.tvModifiedTime.setText(DateUtils.long2DateShort(itemData.getModifiedTime()));String eventTypeStr = viewHolder.strLeftBracket + itemData.getType() + viewHolder.strRightBracket;viewHolder.tvEventType.setText(eventTypeStr);if (itemData.getType().equals(viewHolder.strProfit)) {viewHolder.tvScore.setText(String.valueOf(itemData.getScore()));viewHolder.tvScore.setTextColor(viewHolder.greenColor);} else {viewHolder.tvScore.setText(String.valueOf(itemData.getScore()));viewHolder.tvScore.setTextColor(viewHolder.mainColor);}}class ViewHolder extends RecyclerView.ViewHolder {private int position;@ViewInject(R.id.rlAll)private XiaoBaiRelativeLayout rlAll;@ViewInject(R.id.tvEventTypeName)private XiaobaiTextView tvEventTypeName;@ViewInject(R.id.tvEventType)private XiaobaiTextView tvEventType;@ViewInject(R.id.tvModifiedTime)private XiaobaiTextView tvModifiedTime;@ViewInject(R.id.tvScore)private XiaobaiTextView tvScore;@ViewInject(R.id.tvIntengration)private XiaobaiTextView tvIntengration;@ResInject(id = R.string.str_profit, type = ResType.String)private String strProfit;@ResInject(id = R.string.str_left_bracket, type = ResType.String)private String strLeftBracket;@ResInject(id = R.string.str_right_bracket, type = ResType.String)private String strRightBracket;@ResInject(id = R.string.str_frozen, type = ResType.String)private String strFrozen;@ResInject(id = R.color.main, type = ResType.Color)private int mainColor;@ResInject(id = R.color.green, type = ResType.Color)private int greenColor;public ViewHolder(View itemView) {super(itemView);ViewUtils.inject(this, itemView);initViewParams();}private void initViewParams() {rlAll.initParams();tvEventTypeName.initParams();tvEventType.initParams();tvModifiedTime.initParams();tvScore.initParams();tvEventTypeName.initParams();tvIntengration.initParams();}@OnClick(R.id.rlAll)public void rlAllOnClick(View v) {if (eventInterface != null) {eventInterface.onItemClick(dataSet.get(position), position);}}}}

4、activity使用adapter:

IntengrationAdapter intengrationAdapter = new IntengrationAdapter(context, model.getUserEventRecordVoList(), intengrationAdapterEvent);HeaderableAdapter<IntengrationAdapter> headerableAdapter = new HeaderableAdapter<>(intengrationAdapter);recycleView.setAdapter(headerableAdapter);

二、gridview 类型的 头和脚要单独占一行:

package com.xiaobai.mizar.utils;import android.content.Context;import com.xiaobai.mizar.android.ui.adapter.HeaderableAdapter;/** * Author: walid * Date : 2015/11/4 11:05 */public class GridLayoutManager extends android.support.v7.widget.GridLayoutManager {public GridLayoutManager(Context context, int spanCount, final HeaderableAdapter headerableAdapter) {super(context, spanCount);setSpanSizeLookup(new android.support.v7.widget.GridLayoutManager.SpanSizeLookup() {@Overridepublic int getSpanSize(int position) {//如果是头或者是脚返回一行的数量 ---- > 否则返回1int viewType = headerableAdapter.getItemViewType(position);return headerableAdapter.isHeader(viewType) ? getSpanCount() :       (headerableAdapter.isFooter(viewType) ? getSpanCount() : 1);}});}}

三、间隔线设置:

1.间隔线builder类:

package com.xiaobai.mizar.android.ui.fragment;import android.support.v7.widget.LinearLayoutManager;import android.support.v7.widget.OrientationHelper;import com.xiaobai.mizar.R;import java.io.Serializable;/** * Author: walid * Date : 2015/11/14 14:42 */public class DividerItemDecorationSettings implements Serializable {private int orientation = LinearLayoutManager.VERTICAL;private int dividerWidth = 1;private int dividerHeight = 1;private int dividerColor = R.color.divider;public DividerItemDecorationSettings() {}public DividerItemDecorationSettings(int orientation, int dividerWidth, int dividerHeight, int dividerColor) {this.orientation = orientation;this.dividerWidth = dividerWidth;this.dividerHeight = dividerHeight;this.dividerColor = dividerColor;}public int getOrientation() {return orientation;}public void setOrientation(int orientation) {this.orientation = orientation;}public int getDividerWidth() {return dividerWidth;}public void setDividerWidth(int dividerWidth) {this.dividerWidth = dividerWidth;}public int getDividerHeight() {return dividerHeight;}public void setDividerHeight(int dividerHeight) {this.dividerHeight = dividerHeight;}public int getDividerColor() {return dividerColor;}public void setDividerColor(int dividerColor) {this.dividerColor = dividerColor;}}
2.绘制linearlayout间隔线:

package com.xiaobai.mizar.android.ui.fragment;import android.content.Context;import android.graphics.Canvas;import android.graphics.Paint;import android.graphics.Rect;import android.support.v7.widget.LinearLayoutManager;import android.support.v7.widget.RecyclerView;import android.view.View;import com.xiaobai.mizar.android.ui.adapter.HeaderableAdapter;/** * Author: walid * Date : 2015/11/12 19:26 */public class DividerItemDecoration extends RecyclerView.ItemDecoration {private int orientation = LinearLayoutManager.VERTICAL;/** * 分割参数,包括高度、宽度、颜色 */private DividerItemDecorationSettings settings;/** * 绘制item分割线的画笔,和设置其属性 * 来绘制个性分割线 */private Paint paint;private HeaderableAdapter headerableAdapter;/** * 构造方法传入布局方向,不可不传 */public DividerItemDecoration(Context context, HeaderableAdapter headerableAdapter, DividerItemDecorationSettings settings) {this.orientation = settings.getOrientation();this.headerableAdapter = headerableAdapter;if (orientation != LinearLayoutManager.VERTICAL && orientation != LinearLayoutManager.HORIZONTAL) {throw new IllegalArgumentException("请传入正确的参数");}this.settings = settings;paint = new Paint(Paint.ANTI_ALIAS_FLAG);int dividerColor = context.getResources().getColor(settings.getDividerColor());paint.setColor(dividerColor); /*设置填充*/paint.setStyle(Paint.Style.FILL);}@Overridepublic void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state) {if (orientation == LinearLayoutManager.VERTICAL) {drawVertical(c, parent);} else {drawHorizontal(c, parent);}}/** * 绘制纵向 item 分割线 * * @param canvas * @param parent */private void drawVertical(Canvas canvas, RecyclerView parent) {final int left = parent.getPaddingLeft();final int right = parent.getMeasuredWidth() - parent.getPaddingRight();final int childSize = parent.getChildCount();for (int i = 0; i < childSize; i++) {final View child = parent.getChildAt(i);RecyclerView.LayoutParams layoutParams = (RecyclerView.LayoutParams) child.getLayoutParams();final int top = child.getBottom() + layoutParams.bottomMargin;final int bottom = top + settings.getDividerHeight();int viewType = headerableAdapter.getItemViewType(i);//如果不是脚才去绘制间隔线if (!headerableAdapter.isFooter(viewType)) {//Logger.d("不是脚 + " + i);canvas.drawRect(left, top, right, bottom, paint);} else {//Logger.d("找到脚 + " + i);}}}/** * 绘制横向 item 分割线 * * @param canvas * @param parent */private void drawHorizontal(Canvas canvas, RecyclerView parent) {final int top = parent.getPaddingTop();final int bottom = parent.getMeasuredHeight() - parent.getPaddingBottom();final int childSize = parent.getChildCount();for (int i = 0; i < childSize; i++) {final View child = parent.getChildAt(i);RecyclerView.LayoutParams layoutParams = (RecyclerView.LayoutParams) child.getLayoutParams();final int left = child.getRight() + layoutParams.rightMargin;final int right = left + settings.getDividerWidth();int viewType = headerableAdapter.getItemViewType(i);//如果不是脚才去绘制间隔线if (!headerableAdapter.isFooter(viewType)) {//Logger.d("不是脚 + " + i);canvas.drawRect(left, top, right, bottom, paint);} else {//Logger.d("找到脚 + " + i);}}}/** * 设置item分割线的size */@Overridepublic void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {if (orientation == LinearLayoutManager.VERTICAL) {outRect.set(0, 0, 0, settings.getDividerHeight());} else {outRect.set(0, 0, settings.getDividerWidth(), 0);}}}

3.绘制gridview间隔线:

package com.xiaobai.mizar.android.ui.fragment;import android.content.Context;import android.graphics.Canvas;import android.graphics.Paint;import android.graphics.Rect;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.View;import com.xiaobai.mizar.utils.Logger;import com.xiaobai.mizar.android.ui.adapter.HeaderableAdapter;/** * Author: walid * Date : 2015/11/14 15:06 */public class DividerGridItemDecoration extends RecyclerView.ItemDecoration {/** * 分割参数,包括高度、宽度、颜色 */private DividerItemDecorationSettings settings;private HeaderableAdapter headerableAdapter;/** * 绘制item分割线的画笔,和设置其属性 * 来绘制个性分割线 */private Paint paint;public DividerGridItemDecoration(Context context,                                 DividerItemDecorationSettings settings) {init(context, null, settings);}public DividerGridItemDecoration(Context context, HeaderableAdapter headerableAdapter,                                 DividerItemDecorationSettings settings) {init(context, headerableAdapter, settings);}private void init(Context context, HeaderableAdapter headerableAdapter,                  DividerItemDecorationSettings settings) {int orientation = settings.getOrientation();this.headerableAdapter = headerableAdapter;if (orientation != LinearLayoutManager.VERTICAL && orientation != LinearLayoutManager.HORIZONTAL) {throw new IllegalArgumentException("请传入正确的参数");}this.settings = settings;paint = new Paint(Paint.ANTI_ALIAS_FLAG);int dividerColor = context.getResources().getColor(settings.getDividerColor());paint.setColor(dividerColor); /*设置填充*/paint.setStyle(Paint.Style.FILL);}@Overridepublic void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state) {drawHorizontal(c, parent);drawVertical(c, parent);}// 列数private int getSpanCount(RecyclerView parent) {int spanCount = -1;RecyclerView.LayoutManager layoutManager = parent.getLayoutManager();if (layoutManager instanceof GridLayoutManager) {spanCount = ((GridLayoutManager) layoutManager).getSpanCount();} else if (layoutManager instanceof StaggeredGridLayoutManager) {spanCount = ((StaggeredGridLayoutManager) layoutManager).getSpanCount();}return spanCount;}public void drawHorizontal(Canvas canvas, RecyclerView parent) {int childCount = parent.getChildCount();for (int i = 0; i < childCount; i++) {final View child = parent.getChildAt(i);final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child.getLayoutParams();final int left = child.getLeft() - params.leftMargin;final int right = child.getRight() + params.rightMargin                  + settings.getDividerWidth();final int top = child.getBottom() + params.bottomMargin;final int bottom = top + settings.getDividerWidth();canvas.drawRect(left, top, right, bottom, paint);}}public void drawVertical(Canvas canvas, RecyclerView parent) {final int childCount = parent.getChildCount();for (int i = 0; i < childCount; i++) {int spanCount = getSpanCount(parent);final View child = parent.getChildAt(i);final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child.getLayoutParams();final int top = child.getTop() - params.topMargin;final int bottom = child.getBottom() + params.bottomMargin;final int left = child.getRight() + params.rightMargin;final int right = left + settings.getDividerHeight();canvas.drawRect(left, top, right, bottom, paint);if (isFirstColum(parent, i, spanCount)) {final int top1 = child.getTop() - params.topMargin;final int bottom1 = child.getBottom() + params.bottomMargin + settings.getDividerHeight();final int left1 = params.leftMargin;final int right1 = left + settings.getDividerHeight();canvas.drawRect(left1, top1, right1, bottom1, paint);}}}private boolean isLastColum(RecyclerView parent, int pos, int spanCount, int childCount) {if (headerableAdapter != null) {pos = headerableAdapter.getHeaderCount() + pos;}RecyclerView.LayoutManager layoutManager = parent.getLayoutManager();if (layoutManager instanceof GridLayoutManager) {// 如果是最后一列,则不需要绘制右边if ((pos + 1) % spanCount == 0) {return true;}} else if (layoutManager instanceof StaggeredGridLayoutManager) {int orientation = ((StaggeredGridLayoutManager) layoutManager).getOrientation();if (orientation == StaggeredGridLayoutManager.VERTICAL) {// 如果是最后一列,则不需要绘制右边if ((pos + 1) % spanCount == 0) {return true;}} else {childCount = childCount - childCount % spanCount;// 如果是最后一列,则不需要绘制右边if (pos >= childCount) {return true;}}}return false;}private boolean isFirstColum(RecyclerView parent, int pos, int spanCount) {if (headerableAdapter != null) {pos = headerableAdapter.getHeaderCount() + pos;}RecyclerView.LayoutManager layoutManager = parent.getLayoutManager();if (layoutManager instanceof GridLayoutManager) {// 如果是第一列if ((pos + 1) % spanCount == 1) {return true;}} else if (layoutManager instanceof StaggeredGridLayoutManager) {int orientation = ((StaggeredGridLayoutManager) layoutManager).getOrientation();if (orientation == StaggeredGridLayoutManager.VERTICAL) {// 如果是第一列if ((pos + 1) % spanCount == 0) {return true;}} else {// 如果是第一列if ((pos + 1) % spanCount == 0) {return true;}}}return false;}private boolean isLastRaw(RecyclerView parent, int pos, int spanCount, int childCount) {if (headerableAdapter != null) {pos = headerableAdapter.getHeaderCount() + pos;}RecyclerView.LayoutManager layoutManager = parent.getLayoutManager();if (layoutManager instanceof GridLayoutManager) {//childCount = childCount - childCount % spanCount;// 如果是最后一行,则不需要绘制底部if (pos >= childCount - spanCount) {return true;}} else if (layoutManager instanceof StaggeredGridLayoutManager) {// StaggeredGridLayoutManager 且纵向滚动int orientation = ((StaggeredGridLayoutManager) layoutManager).getOrientation();if (orientation == StaggeredGridLayoutManager.VERTICAL) {// 如果是最后一行,则不需要绘制底部childCount = childCount - childCount % spanCount;if (pos >= childCount) { return true; }} else { // StaggeredGridLayoutManager 且横向滚动// 如果是最后一行,则不需要绘制底部if ((pos + 1) % spanCount == 0) {return true;}}}return false;}private boolean isRvHead(int itemPosition) {if (headerableAdapter == null) {return false;}int type = headerableAdapter.getItemViewType(itemPosition);return headerableAdapter.isHeader(type);}private boolean isRvFoot(int itemPosition) {if (headerableAdapter == null) {return false;}int type = headerableAdapter.getItemViewType(itemPosition);return headerableAdapter.isFooter(type);}@Overridepublic void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {int itemPosition = ((RecyclerView.LayoutParams) view.getLayoutParams()).getViewLayoutPosition();int spanCount = getSpanCount(parent);int childCount = parent.getAdapter().getItemCount();//Logger.d("childCount = " + childCount);//如果有头而且是第一行if (isRvHead(itemPosition) || isRvFoot(itemPosition)) {outRect.set(0, 0, 0, 0);}//else if (isLastRaw(parent, itemPosition, spanCount, childCount)) { // 如果是最后一行//outRect.set(settings.getDividerWidth() / 2, 0, settings.getDividerWidth(), 0);//}else if (isLastColum(parent, itemPosition, spanCount, childCount)) { // 如果是最后一列outRect.set(settings.getDividerWidth() / 2, 0, settings.getDividerWidth(), settings.getDividerHeight());} else if (isFirstColum(parent, itemPosition, spanCount)) {//第一列outRect.set(settings.getDividerWidth(), 0, settings.getDividerWidth() / 2, settings.getDividerHeight());} else {outRect.set(0, 0, settings.getDividerWidth() / 2,            settings.getDividerHeight());}}}


希望能够帮助到大家。。。。





1 0
原创粉丝点击