recyclerview

来源:互联网 发布:access数据库的类型是 编辑:程序博客网 时间:2024/05/17 08:12
<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:id="@+id/activity_main"    android:layout_width="match_parent"    android:layout_margin="1dp"    android:layout_height="match_parent">    <android.support.v7.widget.RecyclerView        android:id="@+id/rv"        android:layout_gravity="center"        android:layout_width="match_parent"        android:layout_height="match_parent" /></RelativeLayout>
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:app="http://schemas.android.com/apk/res-auto"    android:layout_width="100dp"    android:layout_height="100dp"    android:layout_gravity="center"    android:background="#312f2f"    android:padding="5dp"    android:layout_margin="5dp"    android:orientation="vertical">    <ImageView        android:id="@+id/iv"        android:layout_width="60dp"        android:layout_height="75dp"        android:layout_gravity="center"        app:srcCompat="@mipmap/ic_category_0" />    <TextView        android:id="@+id/tv"        android:layout_width="match_parent"        android:gravity="center"        android:layout_gravity="center"        android:layout_height="wrap_content"        android:text="TextView" /></LinearLayout>menu文件夹main
<menu xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:app="http://schemas.android.com/apk/res-auto"    xmlns:tools="http://schemas.android.com/tools"    tools:context="com.zhy.sample.demo_recyclerview.MainActivity" >    <item        android:id="@+id/id_action_add"        android:orderInCategory="100"        android:title="添加"        app:showAsAction="ifRoom">    </item>    <item        android:id="@+id/id_action_delete"        android:orderInCategory="100"        android:title="删除"        app:showAsAction="ifRoom"/>    <item        android:id="@+id/id_action_listview"        android:orderInCategory="100"        android:title="ListView"        app:showAsAction="never"/>    <item        android:id="@+id/id_action_horizontalListView"        android:orderInCategory="100"        android:title="HorizontalListView"        app:showAsAction="never"/>    <item        android:id="@+id/id_action_gridview"        android:orderInCategory="100"         android:title="GirdView"        app:showAsAction="never"/>    <item        android:id="@+id/id_action_horizontalGridView"        android:orderInCategory="100"         android:title="HorizontalGridView"        app:showAsAction="never"/>          <item        android:id="@+id/id_action_staggeredgridview"        android:orderInCategory="100"         android:title="StaggeredGridView"        app:showAsAction="never"/></menu>



main_staggered.xml


<menu xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:app="http://schemas.android.com/apk/res-auto"    xmlns:tools="http://schemas.android.com/tools"    tools:context="com.zhy.sample.demo_recyclerview.MainActivity" >    <item        android:id="@+id/id_action_add"        android:orderInCategory="100"        android:title="add"        app:showAsAction="ifRoom">    </item>    <item        android:id="@+id/id_action_delete"        android:orderInCategory="100"        android:title="delete"        app:showAsAction="ifRoom"/></menu>





package cn.bluemobi.dylan.recyclerviewdemo2;import android.content.res.Resources;import android.graphics.Color;import android.os.Bundle;import android.support.v7.app.AppCompatActivity;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.widget.RelativeLayout;import android.widget.Toast;import java.util.ArrayList;import java.util.List;public class MainActivity extends AppCompatActivity {    private RecyclerView rv;    private List<Integer> datas;    private RecyclerView.ItemDecoration itemDecoration;    private RvAdapter rvAdapter;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        rv = (RecyclerView) findViewById(R.id.rv);        initData();    }    /**     * 初始化数据     */    private void initData() {        datas = new ArrayList<>();        for (int i = 0; i < 38; i++) {            Resources res = getResources();            datas.add(res.getIdentifier("ic_category_" + i, "mipmap", getPackageName()));        }        /**         *用来确定每一个item如何进行排列摆放         * LinearLayoutManager 相当于ListView的效果         GridLayoutManager相当于GridView的效果         StaggeredGridLayoutManager 瀑布流         */        /**第一步:设置布局管理器**/        rv.setLayoutManager(new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false));        /**第二步:添加分割线**/        itemDecoration = new DividerItemDecoration(this, DividerItemDecoration.VERTICAL_LIST);        rv.addItemDecoration(itemDecoration);        /**第三步:设置适配器**/        rvAdapter = new RvAdapter(this, datas);        rv.setAdapter(rvAdapter);        rvAdapter.setOnItemClickListener(new RvAdapter.OnItemClickListener() {            @Override            public void onItemClickListener(int position, Integer data) {                Toast.makeText(MainActivity.this, "点击了" + position, Toast.LENGTH_SHORT).show();            }        });    }    @Override    public boolean onCreateOptionsMenu(Menu menu) {        getMenuInflater().inflate(R.menu.main, menu);        return super.onCreateOptionsMenu(menu);    }    @Override    public boolean onOptionsItemSelected(MenuItem item) {        switch (item.getItemId()) {            /**竖向的ListView**/            case R.id.id_action_listview:                rv.setBackgroundColor(Color.TRANSPARENT);                rv.setLayoutManager(new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false));                rvAdapter.setType(0);                rv.removeItemDecoration(itemDecoration);                rv.setLayoutParams(new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT, RelativeLayout.LayoutParams.MATCH_PARENT));                itemDecoration = new DividerItemDecoration(this, DividerItemDecoration.VERTICAL_LIST);                rv.addItemDecoration(itemDecoration);                break;            /**横向的ListView**/            case R.id.id_action_horizontalListView:                rvAdapter.setType(1);                rv.removeItemDecoration(itemDecoration);                rv.setLayoutParams(new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT, RelativeLayout.LayoutParams.WRAP_CONTENT));                rv.setLayoutManager(new LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, false));                itemDecoration = new DividerItemDecoration(this, DividerItemDecoration.HORIZONTAL_LIST);                rv.addItemDecoration(itemDecoration);                break;            /**竖向的GridView**/            case R.id.id_action_gridview:                rvAdapter.setType(1);                rv.setBackgroundColor(Color.TRANSPARENT);                rv.removeItemDecoration(itemDecoration);                rv.setLayoutParams(new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT, RelativeLayout.LayoutParams.MATCH_PARENT));                rv.setLayoutManager(new GridLayoutManager(this, 5));                itemDecoration = new DividerGridItemDecoration(this);                rv.addItemDecoration(itemDecoration);                break;            /**横向的GridView**/            case R.id.id_action_horizontalGridView:                rvAdapter.setType(1);                rv.setBackgroundColor(Color.TRANSPARENT);                rv.setLayoutParams(new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT, RelativeLayout.LayoutParams.WRAP_CONTENT));                rv.removeItemDecoration(itemDecoration);                rv.setLayoutManager(new StaggeredGridLayoutManager(2, StaggeredGridLayoutManager.HORIZONTAL));                itemDecoration = new DividerGridItemDecoration(this);                rv.addItemDecoration(itemDecoration);                break;            /**竖向的瀑布流**/            case R.id.id_action_staggeredgridview:                rvAdapter.setType(3);                rv.setBackgroundColor(getResources().getColor(R.color.colorAccent));                rv.setLayoutParams(new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT, RelativeLayout.LayoutParams.MATCH_PARENT));                rv.removeItemDecoration(itemDecoration);                rv.setLayoutManager(new StaggeredGridLayoutManager(5, StaggeredGridLayoutManager.VERTICAL));                break;            /**添加一个数据**/            case R.id.id_action_add:                rvAdapter.notifyItemInserted(1);                break;            /**删除一个数据**/            case R.id.id_action_delete:                rvAdapter.notifyItemRemoved(1);                break;        }        return true;    }}



Adapter

package cn.bluemobi.dylan.recyclerviewdemo2;import android.content.Context;import android.support.v7.widget.RecyclerView;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.ImageView;import android.widget.TextView;import java.util.ArrayList;import java.util.List;/** * RecyclerView的适配器 * Created by yuandl on 2016-11-01. */public class RvAdapter extends RecyclerView.Adapter<RvAdapter.MyViewHolder> {    private Context context;    private List<Integer> datas;    /**     * item的点击事件的长按事件接口     */    private OnItemClickListener onItemClickListener;    /**     * 瀑布流时的item随机高度     */    private List<Integer> heights = new ArrayList<>();    /**     * 不同的类型设置item不同的高度     *     * @param type     */    private int type = 0;    public RvAdapter(Context context, List<Integer> datas) {        this.context = context;        this.datas = datas;        for (int i : datas) {            int height = (int) (Math.random() * 100 + 300);            heights.add(height);        }    }    public void setType(int type) {        this.type = type;    }    /**     * 设置点击事件     *     * @param onItemClickListener     */    public void setOnItemClickListener(OnItemClickListener onItemClickListener) {        this.onItemClickListener = onItemClickListener;    }    @Override    public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {        View contentView = LayoutInflater.from(context).inflate(R.layout.item, parent, false);        MyViewHolder viewHolder = new MyViewHolder(contentView);        return viewHolder;    }    @Override    public void onBindViewHolder(MyViewHolder holder, final int position) {        RecyclerView.LayoutParams layoutParams;        if (type == 0) {            layoutParams = new RecyclerView.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);        } else if (type == 1) {            layoutParams = new RecyclerView.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);        } else {            layoutParams = new RecyclerView.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, heights.get(position));            layoutParams.setMargins(2, 2, 2, 2);        }        holder.itemView.setLayoutParams(layoutParams);        holder.imageView.setImageResource(datas.get(position));        holder.tv.setText("分类" + position);        /**设置item点击监听**/        holder.itemView.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View view) {                if (onItemClickListener != null) {                    onItemClickListener.onItemClickListener(position, datas.get(position));                }            }        });    }    @Override    public int getItemCount() {        return datas == null ? 0 : datas.size();    }    /**     * 用于缓存的ViewHolder     */    public class MyViewHolder extends RecyclerView.ViewHolder {        private ImageView imageView;        public TextView tv;        public MyViewHolder(View itemView) {            super(itemView);            imageView = (ImageView) itemView.findViewById(R.id.iv);            tv = (TextView) itemView.findViewById(R.id.tv);        }    }    /**     * 设置item监听的接口     */    public interface OnItemClickListener {        void onItemClickListener(int position, Integer data);    }}





RecyclerViewDivider
package cn.bluemobi.dylan.recyclerviewdemo2;import android.content.Context;import android.content.res.TypedArray;import android.graphics.Canvas;import android.graphics.Paint;import android.graphics.Rect;import android.graphics.drawable.Drawable;import android.support.v4.content.ContextCompat;import android.support.v7.widget.LinearLayoutManager;import android.support.v7.widget.RecyclerView;import android.view.View;/** * Created by yuandl on 2016-11-08. */public class RecycleViewDivider extends RecyclerView.ItemDecoration {    private Paint mPaint;    private Drawable mDivider;    private int mDividerHeight = 2;//分割线高度,默认为1px    private int mOrientation;//列表的方向:LinearLayoutManager.VERTICAL或LinearLayoutManager.HORIZONTAL    private static final int[] ATTRS = new int[]{android.R.attr.listDivider};    /**     * 默认分割线:高度为2px,颜色为灰色     *     * @param context     * @param orientation 列表方向     */    public RecycleViewDivider(Context context, int orientation) {        if (orientation != LinearLayoutManager.VERTICAL && orientation != LinearLayoutManager.HORIZONTAL) {            throw new IllegalArgumentException("请输入正确的参数!");        }        mOrientation = orientation;        final TypedArray a = context.obtainStyledAttributes(ATTRS);        mDivider = a.getDrawable(0);        a.recycle();    }    /**     * 自定义分割线     *     * @param context     * @param orientation 列表方向     * @param drawableId  分割线图片     */    public RecycleViewDivider(Context context, int orientation, int drawableId) {        this(context, orientation);        mDivider = ContextCompat.getDrawable(context, drawableId);        mDividerHeight = mDivider.getIntrinsicHeight();    }    /**     * 自定义分割线     *     * @param context     * @param orientation   列表方向     * @param dividerHeight 分割线高度     * @param dividerColor  分割线颜色     */    public RecycleViewDivider(Context context, int orientation, int dividerHeight, int dividerColor) {        this(context, orientation);        mDividerHeight = dividerHeight;        mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);        mPaint.setColor(dividerColor);        mPaint.setStyle(Paint.Style.FILL);    }    //获取分割线尺寸    @Override    public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {        super.getItemOffsets(outRect, view, parent, state);        outRect.set(0, 0, 0, mDividerHeight);    }    //绘制分割线    @Override    public void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state) {        super.onDraw(c, parent, state);        if (mOrientation == LinearLayoutManager.VERTICAL) {            drawVertical(c, parent);        } else {            drawHorizontal(c, parent);        }    }    //绘制横向 item 分割线    private void drawHorizontal(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 + mDividerHeight;            if (mDivider != null) {                mDivider.setBounds(left, top, right, bottom);                mDivider.draw(canvas);            }            if (mPaint != null) {                canvas.drawRect(left, top, right, bottom, mPaint);            }        }    }    //绘制纵向 item 分割线    private void drawVertical(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 + mDividerHeight;            if (mDivider != null) {                mDivider.setBounds(left, top, right, bottom);                mDivider.draw(canvas);            }            if (mPaint != null) {                canvas.drawRect(left, top, right, bottom, mPaint);            }        }    }}




DividerItemDecorationCommon
package cn.bluemobi.dylan.recyclerviewdemo2;/** * Created by yuandl on 2016-11-09. */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.util.TypedValue;import android.view.View;public class DividerItemDecorationCommon extends RecyclerView.ItemDecoration {    /*    * RecyclerView的布局方向,默认先赋值    * 为纵向布局    * RecyclerView 布局可横向,也可纵向    * 横向和纵向对应的分割想画法不一样    * */    private int mOrientation = LinearLayoutManager.VERTICAL;    /**     * item之间分割线的size,1---5     */    private int mSize;    /**     * 绘制item分割线的画笔,和设置其属性     * 来绘制个性分割线     */    private Paint mPaint;    /**     * 构造方法传入布局方向,不可不传     *     * @param context     context     * @param orientation 布局方向     * @param color       颜色     * @param mItemSize   item之间分割线的size     */    public DividerItemDecorationCommon(Context context, int orientation, int color, int mItemSize) {        this.mOrientation = orientation;        /*     item之间分割线的颜色     */        this.mSize= mItemSize;        if (orientation != LinearLayoutManager.VERTICAL && orientation != LinearLayoutManager.HORIZONTAL) {            throw new IllegalArgumentException("LinearLayoutManager error");        }        mSize = (int) TypedValue.applyDimension(mItemSize, TypedValue.COMPLEX_UNIT_DIP, context.getResources().getDisplayMetrics());        mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);        mPaint.setColor(color);         /*设置填充*/        mPaint.setStyle(Paint.Style.FILL);    }    @Override    public void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state) {        if (mOrientation == LinearLayoutManager.VERTICAL) {            drawVertical(c, parent);        } else {            drawHorizontal(c, parent);        }    }    /**     * 绘制纵向 item 分割线     *     * @param canvas canvas     * @param parent 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 + mSize;            canvas.drawRect(left, top, right, bottom, mPaint);        }    }    /**     * 绘制横向 item 分割线     *     * @param canvas canvas     * @param parent 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 + mSize;            canvas.drawRect(left, top, right, bottom, mPaint);        }    }    /**     * 设置item分割线的size     *     * @param outRect outRect     * @param view    view     * @param parent  parent     * @param state   state     */    @Override    public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {        if (mOrientation == LinearLayoutManager.VERTICAL) {            outRect.set(0, 0, 0, mSize);        } else {            outRect.set(0, 0, mSize, 0);        }    }}
DividerItemDecoration
package cn.bluemobi.dylan.recyclerviewdemo2;/* * Copyright (C) 2014 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * *      http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */import android.content.Context;import android.content.res.TypedArray;import android.graphics.Canvas;import android.graphics.Rect;import android.graphics.drawable.Drawable;import android.support.v7.widget.LinearLayoutManager;import android.support.v7.widget.RecyclerView;import android.util.Log;import android.view.View;/** * This class is from the v7 samples of the Android SDK. It's not by me! * <p/> * See the license above for details. */public class DividerItemDecoration extends RecyclerView.ItemDecoration{   private static final int[] ATTRS = new int[] { android.R.attr.listDivider };   public static final int HORIZONTAL_LIST = LinearLayoutManager.HORIZONTAL;   public static final int VERTICAL_LIST = LinearLayoutManager.VERTICAL;         private Drawable mDivider;   private int mOrientation;   public DividerItemDecoration(Context context, int orientation)   {      final TypedArray a = context.obtainStyledAttributes(ATTRS);      mDivider = a.getDrawable(0);      a.recycle();      setOrientation(orientation);   }   public void setOrientation(int orientation)   {      if (orientation != HORIZONTAL_LIST && orientation != VERTICAL_LIST)      {         throw new IllegalArgumentException("invalid orientation");      }      mOrientation = orientation;   }   @Override   public void onDraw(Canvas c, RecyclerView parent)   {      Log.v("recyclerview - itemdecoration", "onDraw()");       if (mOrientation == VERTICAL_LIST) {               drawVertical(c, parent);           } else {               drawHorizontal(c, parent);           }   }   public void drawVertical(Canvas c, RecyclerView parent)   {      final int left = parent.getPaddingLeft();      final int right = parent.getWidth() - parent.getPaddingRight();      final int childCount = parent.getChildCount();      for (int i = 0; i < childCount; i++)      {         final View child = parent.getChildAt(i);         RecyclerView v = new RecyclerView(               parent.getContext());         final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child               .getLayoutParams();         final int top = child.getBottom() + params.bottomMargin;         final int bottom = top + mDivider.getIntrinsicHeight();         mDivider.setBounds(left, top, right, bottom);         mDivider.draw(c);      }   }   public void drawHorizontal(Canvas c, RecyclerView parent)   {      final int top = parent.getPaddingTop();      final int bottom = parent.getHeight() - parent.getPaddingBottom();      final 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.getRight() + params.rightMargin;         final int right = left + mDivider.getIntrinsicHeight();         mDivider.setBounds(left, top, right, bottom);         mDivider.draw(c);      }   }   @Override   public void getItemOffsets(Rect outRect, int itemPosition,         RecyclerView parent)   {      if (mOrientation == VERTICAL_LIST)      {         outRect.set(0, 0, 0, mDivider.getIntrinsicHeight());      } else      {         outRect.set(0, 0, mDivider.getIntrinsicWidth(), 0);      }   }}


DividerGridItemDecoration
package cn.bluemobi.dylan.recyclerviewdemo2;import android.content.Context;import android.content.res.TypedArray;import android.graphics.Canvas;import android.graphics.Rect;import android.graphics.drawable.Drawable;import android.support.v7.widget.GridLayoutManager;import android.support.v7.widget.RecyclerView;import android.support.v7.widget.RecyclerView.LayoutManager;import android.support.v7.widget.RecyclerView.State;import android.support.v7.widget.StaggeredGridLayoutManager;import android.view.View;public class DividerGridItemDecoration extends RecyclerView.ItemDecoration {    private static final int[] ATTRS = new int[]{android.R.attr.listDivider};    private Drawable mDivider;    public DividerGridItemDecoration(Context context) {        final TypedArray a = context.obtainStyledAttributes(ATTRS);        mDivider = a.getDrawable(0);        a.recycle();    }    @Override    public void onDraw(Canvas c, RecyclerView parent, State state) {        drawHorizontal(c, parent);        drawVertical(c, parent);    }    private int getSpanCount(RecyclerView parent) {        // 列数        int spanCount = -1;        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 c, 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                    + mDivider.getIntrinsicWidth();            final int top = child.getBottom() + params.bottomMargin;            final int bottom = top + mDivider.getIntrinsicHeight();            mDivider.setBounds(left, top, right, bottom);            mDivider.draw(c);        }    }    public void drawVertical(Canvas c, RecyclerView parent) {        final 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 top = child.getTop() - params.topMargin;            final int bottom = child.getBottom() + params.bottomMargin;            final int left = child.getRight() + params.rightMargin;            final int right = left + mDivider.getIntrinsicWidth();            mDivider.setBounds(left, top, right, bottom);            mDivider.draw(c);        }    }    private boolean isLastColum(RecyclerView parent, int pos, int spanCount,                                int childCount) {        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 isLastRaw(RecyclerView parent, int pos, int spanCount,                              int childCount) {        LayoutManager layoutManager = parent.getLayoutManager();        if (layoutManager instanceof GridLayoutManager) {            childCount = childCount - childCount % spanCount;            if (pos >= childCount)// 如果是最后一行,则不需要绘制底部                return true;        } else if (layoutManager instanceof StaggeredGridLayoutManager) {            int orientation = ((StaggeredGridLayoutManager) layoutManager)                    .getOrientation();            // StaggeredGridLayoutManager 且纵向滚动            if (orientation == StaggeredGridLayoutManager.VERTICAL) {                childCount = childCount - childCount % spanCount;                // 如果是最后一行,则不需要绘制底部                if (pos >= childCount)                    return true;            } else            // StaggeredGridLayoutManager 且横向滚动            {                // 如果是最后一行,则不需要绘制底部                if ((pos + 1) % spanCount == 0) {                    return true;                }            }        }        return false;    }    @Override    public void getItemOffsets(Rect outRect, int itemPosition,                               RecyclerView parent) {        int spanCount = getSpanCount(parent);        int childCount = parent.getAdapter().getItemCount();        if (isLastRaw(parent, itemPosition, spanCount, childCount))// 如果是最后一行,则不需要绘制底部        {            outRect.set(0, 0, mDivider.getIntrinsicWidth(), 0);        } else if (isLastColum(parent, itemPosition, spanCount, childCount))// 如果是最后一列,则不需要绘制右边        {            outRect.set(0, 0, 0, mDivider.getIntrinsicHeight());        } else {            outRect.set(0, 0, mDivider.getIntrinsicWidth(),                    mDivider.getIntrinsicHeight());        }    }}


drawable
divider
<?xml version="1.0" encoding="utf-8"?><shape xmlns:android="http://schemas.android.com/apk/res/android"    android:shape="rectangle" >    <solid android:color="@color/colorAccent"/>    <size android:height="1dp"        android:width="1dp"/></shape>



divider_vertical
<?xml version="1.0" encoding="utf-8"?><shape xmlns:android="http://schemas.android.com/apk/res/android"    android:shape="rectangle">    <solid android:color="@color/colorAccent"/>    <size android:width="1dp" /></shape>




 
0 0
原创粉丝点击