如何设置recyclerview 自定义linearlayouttmanager item 与父布局间距

* 设置瀑布流布局中的某个item,独占一行、占一列、占两列、等等
* @param mStaggeredGridLayoutManager
* @param position 目标item所在的位置
* @param TARGET_ITEM_TYPE 目标item的条目类型
* @param parentView 该item的整个布局
private void setStaggeredItemSpanCount(StaggeredGridLayoutManager mStaggeredGridLayoutManager,int position,int TARGET_ITEM_TYPE,View parentView){
int type = getItemViewType(position);
if(type == TARGET_ITEM_TYPE){
StaggeredGridLayoutManager.LayoutParams layoutParams =
new StaggeredGridLayoutManager.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.WRAP_CONTENT);
layoutParams.setFullSpan(true);
parentView.setLayoutParams(layoutParams);
本文已收录于以下专栏:
相关文章推荐
当Recycler中需要下拉刷新的时候。就想自己实现一下。
发现LinearLayoutManager时,体验完美。但是,到了GridLayoutManager和StaggeredGridLayout...
Android5.0 v7扩展包之RecyclerView
Android开发文章 android
RecyclerView
近日Google发布了Android5.0 SDK...
recyclerView瀑布流实现
使用StaggeredGridLayoutManager来实现瀑布流效果
流布局》》》》
MainActivitypackage com.bwie.recyclerview_practice2;import android.support.v7.app.AppCompatA...
RecyclerView的删除和增加的动漫效果
RecyclerView
这东西可厉害了,不仅可以实现ListView和ViewPager的大部分功能,而且使用起来更容易,更自定义,视觉效果也更多样化,今儿主要说三个有关的标签:
LinearL...
今天,花了很长的时间才实现了如题的效果,回想一下,实现起来确实不难,只怪当时做的时候思路不清晰,没想好就动手了,这是病,得改!好了,不多说,实现工程中主要参考了鸿洋博客中Android Recycle...
ScrollView嵌套RecyclerView时,android:layout_height=”wrap_content”并不起作用,RecyclerView会填充剩余的整个屏幕空间,也就相当于an...
他的最新文章
讲师:王哲涵
讲师:王渊命
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)52528人阅读
转载请注明出处:http://write.blog.csdn.net/postedit/
编写RecyclerView.ItemDecoration时,在onDraw方法中,Drawable的高度等于RecyclerView的高度减去RecyclerView的上下padding。
public void onDraw(Canvas c, RecyclerView parent, State state) {
int top = parent.getPaddingTop();
int bottom = parent.getHeight() - parent.getPaddingBottom();
int childCount = parent.getChildCount();
for(int i=0;i & childCi++){
View child = parent.getChildAt(i);
RecyclerView.LayoutParams layoutParams = (RecyclerView.LayoutParams)child.getLayoutParams();
int left = child.getRight() + layoutParams.rightM
int right = left + mDivider.getIntrinsicWidth();
mDivider.setBounds(left, top, right, bottom);
mDivider.draw(c);
}但运行后的显示效果却和我的预期相差很大
可以看到,ItemDecoration高度竟然全屏了,然后检查xml布局文件:
activity_main.xml
&RelativeLayout xmlns:android=&/apk/res/android&
xmlns:tools=&/tools&
android:layout_width=&match_parent&
android:layout_height=&match_parent&
tools:context=&com.xmy.recylerviewdemo.MainActivity& &
&android.support.v7.widget.RecyclerView
android:id=&@+id/recyclerView&
android:layout_width=&wrap_content&
android:layout_height=&wrap_content&/&
&/RelativeLayout&item.xml
&?xml version=&1.0& encoding=&utf-8&?&
&LinearLayout xmlns:android=&/apk/res/android&
android:layout_width=&wrap_content&
android:layout_height=&wrap_content&
android:gravity=&center&
android:padding=&10.0dip&
android:orientation=&vertical& &
&ImageView
android:id=&@+id/item_iv&
android:layout_width=&wrap_content&
android:layout_height=&wrap_content&
android:scaleType=&center&
android:src=&@drawable/img&
android:adjustViewBounds=&true&/&
android:id=&@+id/item_tv&
android:layout_width=&wrap_content&
android:layout_height=&wrap_content&/&
&/LinearLayout&xml布局文件中RecyclerView和Item的高度都设定的是wrap_content,那说好的自适应于item高度呢?查看Android文档,没发现有关RecyclerView高度相关说明,看来只能自己动手丰衣足食了。
根据里提到的,RecyclerView并不负责Item的显示工作,而Adapter负责的是数据仓库和Item的视图,所以最终把目标锁定到RecyclerView.LayoutManager上。于是尝试继承LinearLayoutManager,发现果然有onMeasure方法:
public void onMeasure(Recycler recycler, State state, int widthSpec,int heightSpec)在onMeasure中可以获得RecyclerView.Recycler。Recycler负责管理Item视图的重复利用,所以我们可以通过Recycler获取一个Item视图的实例,然后像复写其他ViewGroup一样,使用measureChild获取子视图的高度后使用setMeasuredDimension设置RecyclerView同样的高度即可。
public class MyLayoutManager extends LinearLayoutManager {
public MyLayoutManager(Context context) {
super(context);
// TODO Auto-generated constructor stub
public void onMeasure(Recycler recycler, State state, int widthSpec,int heightSpec) {
View view = recycler.getViewForPosition(0);
if(view != null){
measureChild(view, widthSpec, heightSpec);
int measuredWidth = MeasureSpec.getSize(widthSpec);
int measuredHeight = view.getMeasuredHeight();
setMeasuredDimension(measuredWidth, measuredHeight);
}修改完之后的运行效果图:
最后奉上示例程序。
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:464513次
积分:1844
积分:1844
排名:千里之外
原创:21篇
评论:100条
(2)(3)(5)(10)(1)(2)
(window.slotbydup = window.slotbydup || []).push({
id: '4740881',
container: s,
size: '200,200',
display: 'inlay-fix'问题对人有帮助,内容完整,我也想知道答案
问题没有实际价值,缺少关键内容,没有改进余地
styles.xml做如下修改:
&style name="AppBaseTheme" parent="android:Theme.Light"&&/style&
&!-- Application theme. --&
&style name="AppTheme" parent="AppBaseTheme"&
&!-- 修改分割线样式--&
&item name="android:listDivider"&@drawable/s&/item&
@draweble/s代码如下:
&?xml version="1.0" encoding="utf-8"?&
&shape xmlns:android="/apk/res/android"
android:shape="rectangle" &
android:centerColor="#ff00ff00"
android:endColor="#ff0000ff"
android:startColor="#ffff0000"
android:type="linear" /&
&size android:height="4dp"/&
MyItemDecoration代码如下:
package com.wuzhiqiang.lea
import android.content.C
import android.content.res.TypedA
import android.graphics.C
import android.graphics.drawable.D
import android.support.v7.widget.RecyclerV
import android.view.V
* Created by mfpc on .
public class MyItemDecoration extends RecyclerView.ItemDecoration
private static final int[] ATTRS = {android.R.attr.listDivider};
private Drawable mD
public MyItemDecoration(Context context)
TypedArray array = context.obtainStyledAttributes(ATTRS);
// 获取分隔条
mDivider = array.getDrawable(0);
array.recycle();
public void onDrawOver(Canvas c, RecyclerView parent, RecyclerView.State state)
super.onDrawOver(c, parent, state);
int count = parent.getChildCount();
int left = parent.getPaddingLeft();
int right = parent.getWidth()-parent.getPaddingRight();
for(int i = 0; i & i++)
View v = parent.getChildAt(i);
RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) v.getLayoutParams();
int top = v.getBottom() + params.bottomM
int bottom = top + mDivider.getIntrinsicHeight();
mDivider.setBounds(left,top,right,bottom);
mDivider.draw(c);
但是中间出错了:
@drawabel/s文件应该怎么写?或者使其他地方有问题?
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
应为 RecyclerView 和 LayoutManager 是分离的,所以没有分割线属性,可以用 RecyclerView.ItemDecoration 进行分割线的绘制。
提供一个简单的装饰
* 分隔线装饰
* @author youmingdot
public class DividerLine extends RecyclerView.ItemDecoration {
* 水平方向
public static final int HORIZONTAL = LinearLayoutManager.HORIZONTAL;
* 垂直方向
public static final int VERTICAL = LinearLayoutManager.VERTICAL;
// 布局方向
// 分割线颜色
// 分割线尺寸
public DividerLine() {
this(VERTICAL);
public DividerLine(int orientation) {
this.orientation =
paint = new Paint();
public void onDrawOver(Canvas c, RecyclerView parent, RecyclerView.State state) {
super.onDrawOver(c, parent, state);
if (orientation == VERTICAL) {
drawHorizontal(c, parent);
drawVertical(c, parent);
* 设置分割线颜色
* @param color 颜色
public void setColor(int color) {
this.color =
paint.setColor(color);
* 设置分割线尺寸
* @param size 尺寸
public void setSize(int size) {
this.size =
// 绘制垂直分割线
protected void drawVertical(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 & childC i++) {
final View child = parent.getChildAt(i);
final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child.getLayoutParams();
final int left = child.getRight() + params.rightM
final int right = left +
c.drawRect(left, top, right, bottom, paint);
// 绘制水平分割线
protected void drawHorizontal(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 & childC i++) {
final View child = parent.getChildAt(i);
final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child.getLayoutParams();
final int top = child.getBottom() + params.bottomM
final int bottom = top +
c.drawRect(left, top, right, bottom, paint);
DividerLine dividerLine = new DividerLine(DividerLine.VERTICAL);
dividerLine.setSize(1);
dividerLine.setColor(0xFFDDDDDD);
recyclerView.addItemDecoration(dividerLine);
同步到新浪微博
分享到微博?
Hi,欢迎来到 SegmentFault 技术社区!⊙▽⊙ 在这里,你可以提出编程相关的疑惑,关注感兴趣的问题,对认可的回答投赞同票;大家会帮你解决编程的问题,和你探讨技术更新,为你的回答投上赞同票。
明天提醒我
关闭理由:
删除理由:
忽略理由:
推广(招聘、广告、SEO 等)方面的内容
与已有问题重复(请编辑该提问指向已有相同问题)
答非所问,不符合答题要求
宜作评论而非答案
带有人身攻击、辱骂、仇恨等违反条款的内容
无法获得确切结果的问题
非开发直接相关的问题
非技术提问的讨论型问题
其他原因(请补充说明)
我要该,理由是:删除 RecyclerView 中各项之间的间距android
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.
我用 RecyclerView 来显示项的列表,需要删除项目之间的默认间距。我试着设置 RecyclerView.LayoutParams 和集利润率为零我 LinearLayoutManager 但没工作 !
在这里我的代码:
layout/fragment_recycler.xml
&android.support.v4.widget.SwipeRefreshLayout
android:id="@+id/freshSwipeView"
android:layout_width="match_parent"
android:layout_height="match_parent"&
&android.support.v7.widget.RecyclerView
android:id="@+id/freshRecyclerView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scrollbars="vertical" /&
&/android.support.v4.widget.SwipeRefreshLayout&
layout/cardview_recycler.xml
&android.support.v7.widget.CardView
android:id="@+id/card_view"
android:layout_width="match_parent"
android:layout_height="match_parent"&
&LinearLayout
android:id="@+id/content"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal"&
&mypackagename.ui.view.RecyclingImageView
android:id="@+id/avatar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:scaleType="fitXY"
android:adjustViewBounds="true"
android:src="@drawable/img_no_avatar" /&
android:id="@+id/username"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_vertical"
android:singleLine="true"
android:ellipsize="end"
android:padding="@dimen/spacing"
android:textColor="@color/black"
android:layout_alignParentBottom="true"
android:textSize="@dimen/text_smallest" /&
&/LinearLayout&
&/android.support.v7.widget.CardView&
RecyclerFragment.java
/* Setting Layout Manager */
mLayoutManager = new LinearLayoutManager(getActivity(), LinearLayoutManager.VERTICAL, false);
RecyclerView.LayoutParams params = new
RecyclerView.LayoutParams(RecyclerView.LayoutParams.MATCH_PARENT, RecyclerView.LayoutParams.WRAP_CONTENT);
params.setMargins(0,0,0,0);
mLayoutManager.canScrollVertically();
mRecyclerView.setLayoutManager(mLayoutManager);
我需要帮助......
解决方法 1:
只需删除卡片视图-在你的layout/cardview_recycler.xml, android 提出了,你不想要的间距
&LinearLayout
android:id="@+id/content"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal"&
&mypackagename.ui.view.RecyclingImageView
android:id="@+id/avatar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:scaleType="fitXY"
android:adjustViewBounds="true"
android:src="@drawable/img_no_avatar" /&
android:id="@+id/username"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_vertical"
android:singleLine="true"
android:ellipsize="end"
android:padding="@dimen/spacing"
android:textColor="@color/black"
android:layout_alignParentBottom="true"
android:textSize="@dimen/text_smallest" /&
&/LinearLayout&
一切保持原样首先需要v7包
如果显示的是图片,可以用下面这个AutoLoadRecyclerView,他可以在快速滑动时停止加载,避免OOM和内存资源浪费
public class AutoLoadRecyclerView extends RecyclerView {
public AutoLoadRecyclerView(Context context) {
this(context, null);
public AutoLoadRecyclerView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
public AutoLoadRecyclerView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
setOnScrollListener(new AutoLoadScrollListener(null, true, true));
* 配置显示图片,需要设置这几个参数,快速滑动时,暂停图片加载
* @param imageLoader
ImageLoader实例对象
* @param pauseOnScroll
* @param pauseOnFling
public void setOnPauseListenerParams(ImageLoader imageLoader, boolean pauseOnScroll, boolean pauseOnFling) {
setOnScrollListener(new AutoLoadScrollListener(imageLoader, pauseOnScroll, pauseOnFling));
//加载更多的回调接口
public interface onLoadMoreListener {
void loadMore();
* 滑动自动加载监听器
private class AutoLoadScrollListener implements OnScrollListener {
private ImageLoader imageL
private final boolean pauseOnS
private final boolean pauseOnF
public AutoLoadScrollListener(ImageLoader imageLoader, boolean pauseOnScroll, boolean pauseOnFling) {
this.pauseOnScroll = pauseOnS
this.pauseOnFling = pauseOnF
this.imageLoader = imageL
public void onScrollStateChanged(int i) {
//根据newState状态做处理
if (imageLoader != null) {
switch (i) {
imageLoader.resume();
if (pauseOnScroll) {
imageLoader.pause();
imageLoader.resume();
if (pauseOnFling) {
imageLoader.pause();
imageLoader.resume();
public void onScrolled(int i, int i1) {
接下来在布局文件中使用它
&com.robosea.robofish.view.AutoLoadRecyclerView
android:id=&@+id/mRecyclerView&
android:layout_alignParentBottom=&true&
android:layout_width=&match_parent&
android:layout_height=&94px&
android:background=&@drawable/local_bottom_list_bg&
android:paddingBottom=&13px&
android:paddingLeft=&30px&
android:paddingRight=&30px&
android:paddingTop=&13px&
android:scrollbars=&none&/&
RecyclerView指定纵向排列还是横向排列是在代码中通过布局管理器设置的,对于RecyclerView来说,必须设置布局管理器,否则会报异常:
& & java.lang.NullPointerException: Attempt to invoke virtual method 'void android.support.v7.widget.RecyclerView$LayoutManager.onMeasure(android.support.v7.widget.RecyclerView$Recycler, android.support.v7.widget.RecyclerView$State, int, int)' on a null object
设置布局管理器,findViewById之后就设置
LinearLayoutManager layoutManager = new LinearLayoutManager(this);
layoutManager.setOrientation(LinearLayoutManager.HORIZONTAL);
mRecyclerView.setLayoutManager(layoutManager);
那么RecyclerView条目的间距怎么设置呢?使用RecyclerView的addItemDecoration方法,
方法参数依靠这个类来设置:
public class SpacesItemDecoration extends RecyclerView.ItemDecoration {
public SpacesItemDecoration(int space) {
this.space =
public void getItemOffsets(Rect outRect, int itemPosition, RecyclerView parent) {
super.getItemOffsets(outRect, itemPosition, parent);
outRect.left =
outRect.right =
outRect.bottom =
// Add top margin only for the first item to avoid double space between items
if(itemPosition == 0)
outRect.top =
使用的时候定义一个int值,也就是间隔的像素,传入SpacesItemDecoration的构造参数就可以了
int spacingInPixels = 9;
mRecyclerView.addItemDecoration(new SpacesItemDecoration(spacingInPixels));
最后就是设置Adapter了,以下面这个Adapter为例,我们可以看到展示数据和设置条目的点击事件
public class LocalVideoGalleryAdapter extends RecyclerView.Adapter&LocalVideoGalleryAdapter.ViewHolder& {
private LayoutInflater mI
private List&Video& imageInfoL
private OnItemClickLitener mOnItemClickL
public LocalVideoGalleryAdapter(List&Video& imageInfoList, Activity activity) {
this.imageInfoList = imageInfoL
this.activity =
mInflater = LayoutInflater.from(activity);
public static class ViewHolder extends RecyclerView.ViewHolder {
public ViewHolder(View arg0) {
super(arg0);
ImageView mI
public int getItemCount() {
return imageInfoList.size();
public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
View view = mInflater.inflate(R.layout.activity_index_gallery_item, viewGroup, false);
ViewHolder viewHolder = new ViewHolder(view);
viewHolder.mImg = (ImageView) view.findViewById(R.id.id_index_gallery_item_image);
return viewH
public void onBindViewHolder(final ViewHolder viewHolder, final int i) {
App.imageLoader.displayImage(&file://& + imageInfoList.get(i).getPath(), viewHolder.mImg, App.options);
if (mOnItemClickLitener != null) {
viewHolder.itemView.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
mOnItemClickLitener.onItemClick(viewHolder.itemView, i);
public interface OnItemClickLitener {
void onItemClick(View view, int position);
public void setOnItemClickLitener(OnItemClickLitener mOnItemClickLitener) {
this.mOnItemClickLitener = mOnItemClickL
我们需要写一个ViewHolder类来继承RecyclerView.ViewHolder
在onCreateViewHolder方法中找到条目中的View
在onBindViewHolder对条目设置数据,由于RecyclerView和其他View不同,并没有setOnItemClickLitener这个方法,所以我们需要自己来创造一个setOnItemClickLitener方法。
& & & & 做法就是对条目中的View设置点击事件在点击事件中调取我们自己定义的接口OnItemClickLitener中的回调方法onItemClick
& & & & Activity中使用的时候,让Activity实现我们自定义的OnItemClickLitener接口,对RecyclerView使用我们自己写的setOnItemClickLitener方法,传入this就可以了
mAdapter.setOnItemClickLitener(this);在getItemCount方法中传入条目的数量
其他相关:
mRecyclerView.scrollToPosition(position);
//滚动到对应索引位置(当该位置已经展示在屏幕中时,并不会出现滚动效果)
本文已收录于以下专栏:
相关文章推荐
GridView在RecyclerView中设置条目点击事件,Item点击事件,获取Item的位置
废话不多说直接贴代码package com.yl.ylnews.
import android.app.A
import android.support.v7.wid...
RecyclerView 的工具类,更方便的实现 Adapter,item 点击事件,更快的实现加载提示,分页加载。
首先展示一下效果!
一、Recycler的基础使用先来了解一下它是干啥的:
可以实现ListView的效果
可以实现GridView的效果
可以实现瀑布流的效果
主要是通过设置它的setLayoutManager来决...
老规矩,先看效果;
这里我就不再过多的介绍RecyclerView,既然大家在找使用RecyclerView的demo想必大家都了解过了,如果不了解网上随便打开一篇RecyclerView的文章应该都...
他的最新文章
讲师:王哲涵
讲师:王渊命
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)

我要回帖

更多关于 recyclertablayout 的文章

 

随机推荐