RecyclerView的divider的问题

来源:互联网 发布:解放军报网络投稿方式 编辑:程序博客网 时间:2024/05/17 18:14

recyclerview的divider的和listview不一样,也有官方的提供的API进行设置divider,代码如下:

 LinearLayoutManager manager = new LinearLayoutManager(this);        view.setLayoutManager(manager);        DividerItemDecoration divider=new DividerItemDecoration(this,manager.getOrientation());        view.addItemDecoration(divider);        MyAdapter adapter = new MyAdapter();        view.setAdapter(adapter);

下面是效果图
这里写图片描述

如果换成gridview的样式呢?,下图是gridview的样式,但是这种效果貌似不相符啊
这里写图片描述

关键部分来了,下面是gridview的间隔线代码;

        //初始化view        GridLayoutManager manager = new GridLayoutManager(this,3);        recyView.setLayoutManager(manager);        GridItemDecoration itemDecration = new GridItemDecoration(this);        recyView.addItemDecoration(itemDecration);        MyAdapter adapter = new MyAdapter();        recyView.setAdapter(adapter);    /**     * 自定义分割线     */    public class GridItemDecoration extends RecyclerView.ItemDecoration {        private Drawable mDivider;        private int[] attrs = new int[]{                android.R.attr.listDivider        };        GridItemDecoration(Context context) {            TypedArray typedArray = context.obtainStyledAttributes(attrs);            mDivider = typedArray.getDrawable(0);            typedArray.recycle();        }        @Override        public void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state) {            drawVertical(c, parent);            drawHorizontal(c, parent);        }        private void drawHorizontal(Canvas c, RecyclerView parent) {            // 绘制水平间隔线            int childCount = parent.getChildCount();            for (int i = 0; i < childCount; i++) {                View child = parent.getChildAt(i);                RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child.getLayoutParams();                int left = child.getLeft() - params.leftMargin;                int right = child.getRight() + params.rightMargin;                int top = child.getBottom() + params.bottomMargin;                int bottom = top + mDivider.getIntrinsicHeight();                mDivider.setBounds(left, top, right, bottom);                mDivider.draw(c);            }        }        private void drawVertical(Canvas c, RecyclerView parent) {            //绘制垂直间隔线(垂直的矩形)            int childCount = parent.getChildCount();            for (int i = 0; i < childCount; i++) {                View child = parent.getChildAt(i);                RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child.getLayoutParams();                int left = child.getRight() + params.rightMargin;                int right = left + mDivider.getIntrinsicWidth();                int top = child.getTop() - params.topMargin;                int bottom = child.getBottom() + params.bottomMargin;                mDivider.setBounds(left, top, right, bottom);                mDivider.draw(c);            }        }        @Override        @Deprecated        public void getItemOffsets(Rect outRect, int itemPosition,                                   RecyclerView parent) {            // 四个方向的偏移值            int right = mDivider.getIntrinsicWidth();            int bottom = mDivider.getIntrinsicHeight();            if (isLastColum(itemPosition, parent)) {//是否是最后一列//          outRect.set(0, 0, 0, bottom);                right = 0;            }            if (isLastRow(itemPosition, parent)) {//是最后一行//          outRect.set(0, 0, right, 0);                bottom = 0;            }            outRect.set(0, 0, right, bottom);        }        /**         * 是否是最后一行         *         */        private boolean isLastRow(int itemPosition, RecyclerView parent) {            int spanCount = getSpanCount(parent);            RecyclerView.LayoutManager layoutManager = parent.getLayoutManager();            //有多少列            if (layoutManager instanceof GridLayoutManager) {                int childCount = parent.getAdapter().getItemCount();                int lastRowCount = childCount % spanCount;                //最后一行的数量小于spanCount                if (lastRowCount == 0 || lastRowCount < spanCount) {                    return true;                }            }            return false;        }        /**         * 判断是否是最后一列         *         */        private boolean isLastColum(int itemPosition, RecyclerView parent) {            RecyclerView.LayoutManager layoutManager = parent.getLayoutManager();            //有多少列            if (layoutManager instanceof GridLayoutManager) {                int spanCount = getSpanCount(parent);                if ((itemPosition + 1) % spanCount == 0) {                    return true;                }            }            return false;        }        private int getSpanCount(RecyclerView parent) {            RecyclerView.LayoutManager layoutManager = parent.getLayoutManager();            if (layoutManager instanceof GridLayoutManager) {                GridLayoutManager lm = (GridLayoutManager) layoutManager;                return lm.getSpanCount();            }            return 0;        }    }

这里写图片描述

注意:recyview的item一定要保持一样的宽高,divider会出现错乱和衔接对不上的情况。

原创粉丝点击