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; }}
Adapterpackage 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); }}
RecyclerViewDividerpackage 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); } } }}DividerItemDecorationCommonpackage 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); } }}DividerGridItemDecorationpackage 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
- RecyclerView
- RecyclerView
- RecyclerView
- RecyclerView
- RecyclerView
- RecyclerView
- RecyclerView
- RecyclerView
- RecyclerView
- RecyclerView
- RecyclerView
- RecyclerView
- RecyclerView
- RecyclerView
- RecyclerView
- RecyclerView
- RecyclerView
- RecyclerView
- 总线概述及常见总线
- 相关网络资源
- 视频直播技术介绍
- 商品展示,以及增 删 改 查功能
- 间断点的判断与分类
- recyclerview
- 求1+2!+3!+4!+…+30!。 科学计数法,保留两位小数。
- gdufe acm 1068 Tempter of the Bone
- Delphi中的SHA256算法
- Android关于百度地图开发的几个常用方法
- Android开发中gitignore文件模板添加
- CentOS下解决SSH自动断开办法
- c++获取屏幕大小
- 深入理解读写锁—ReadWriteLock源码分析