gallerylayoutmanagerr怎么读

温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!&&|&&
LOFTER精选
网易考拉推荐
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
GridLayoutManager mLayoutManager = new GridLayoutManager(this, spanCount);recyclerView.setLayoutManager(mLayoutManager);mLayoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
public int getSpanSize(int position) {
switch (seRecyclerAdapter.getItemViewType(position)) {
case SeRecyclerAdapter.MODEL_TYPE_SECTION:
return spanCount;
阅读(2836)|
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
历史上的今天
在LOFTER的更多文章
loftPermalink:'',
id:'fks_',
blogTitle:'GridLayoutManager 跨列',
blogAbstract:'GridLayoutManager 设置&RecyclerView 的子单元跨列GridLayoutManager mLayoutManager = new GridLayoutManager(this, spanCount);recyclerView.setLayoutManager(mLayoutManager);mLayoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {',
blogTag:'gridlayoutmanager,跨列',
blogUrl:'blog/static/8',
isPublished:1,
istop:false,
modifyTime:0,
publishTime:8,
permalink:'blog/static/8',
commentCount:0,
mainCommentCount:0,
recommendCount:0,
bsrk:-100,
publisherId:0,
recomBlogHome:false,
currentRecomBlog:false,
attachmentsFileIds:[],
groupInfo:{},
friendstatus:'none',
followstatus:'unFollow',
pubSucc:'',
visitorProvince:'',
visitorCity:'',
visitorNewUser:false,
postAddInfo:{},
mset:'000',
remindgoodnightblog:false,
isBlackVisitor:false,
isShowYodaoAd:false,
hostIntro:'',
hmcon:'1',
selfRecomBlogCount:'0',
lofter_single:''
{list a as x}
{if x.moveFrom=='wap'}
{elseif x.moveFrom=='iphone'}
{elseif x.moveFrom=='android'}
{elseif x.moveFrom=='mobile'}
${a.selfIntro|escape}{if great260}${suplement}{/if}
{list a as x}
推荐过这篇日志的人:
{list a as x}
{if !!b&&b.length>0}
他们还推荐了:
{list b as y}
转载记录:
{list d as x}
{list a as x}
{list a as x}
{list a as x}
{list a as x}
{if x_index>4}{break}{/if}
${fn2(x.publishTime,'yyyy-MM-dd HH:mm:ss')}
{list a as x}
{if !!(blogDetail.preBlogPermalink)}
{if !!(blogDetail.nextBlogPermalink)}
{list a as x}
{if defined('newslist')&&newslist.length>0}
{list newslist as x}
{if x_index>7}{break}{/if}
{list a as x}
{var first_option =}
{list x.voteDetailList as voteToOption}
{if voteToOption==1}
{if first_option==false},{/if}&&“${b[voteToOption_index]}”&&
{if (x.role!="-1") },“我是${c[x.role]}”&&{/if}
&&&&&&&&${fn1(x.voteTime)}
{if x.userName==''}{/if}
网易公司版权所有&&
{list x.l as y}
{if defined('wl')}
{list wl as x}{/list}mAdapter.setRecommendFrontVO(result); mRecyclerView.setAdapter(mAdapter); mAdapter.notifyDataSetChanged(); lastVisibleItem =((LinearLayoutManager) mRecyclerView.getLayoutManager()).findLastVisibleItemPosition(); mAdapter.notifyItemRangeInserted(lastVisibleItem, newinfoListVO.size());
mRecyclerView.scrollToPosition(lastVisibleItem + 1);
解决方案 链接地址 LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this) {
protected int getExtraLayoutSpace(RecyclerView.State state) {
return 300;
}; 只有LinearLayoutManager 有这个方法。 3.获取通讯录联系人 根据拼音排序 获取拼音首字母 5.0以下 可以根据sort_key 这个字段进行排序,5.0以上根据phonebook_label来排序
版权声明:本文为博主原创文章,未经博主允许不得转载。
LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getActivity());
linearLayoutManager.setOrientation(LinearLayoutManager.HORIZONTAL);
floor1RecyView.setLayoutManager(linearLayoutManager); 我得到的结果就是: Fragment
$LayoutManager.canScrollVertically()’ on a null object reference 看一下字面意思:空指针,试图在一个空的对象引用上调用一个虚拟方法canScrollVertically() 回去看了一下文档,原来RecyclerView将 layout 抽象成了一个 LayoutManager,RecyclerView 不负责子 View 的布局,我们可以自定义 LayoutManager 来实现不同的布局效果,目前只提供了LinearLayoutManager
LayoutManager ,LinearLayoutManager linearLayoutManager = new LinearLayoutManager(context); 4、可以设置LayoutManager 的方向,linearLayoutManager.setOrientation(LinearLayoutManager.HORIZONTAL); 5、把LayoutManager 给RecyclerView,mRecyclerView.setLayoutManager
super.onScrolled(recyclerView, dx, dy);
RecyclerView.LayoutManager layoutManager = recyclerView.getLayoutManager();
int totalItemCount = layoutManager.getItemCount();
if (layoutManager instanceof LinearLayoutManager
链接地址 1.解决Scrollview 嵌套recyclerview显示不出来问题,LinearLayoutManager,GridLayoutManager,StaggeredGridLayoutManager提供三个子类用于解决该问题。 2.解决嵌套recyclerview滑动卡顿问题 3.解决Scrollview没有滑动到顶部问题 版权声明:本文为sunger原创文章,未经博主允许不得转载。
LinearLayoutManager的layout manager
LinearLayoutManager mLayoutManager = new LinearLayoutManager(this);
mRecyclerView.setLayoutManager(mLayoutManager);
} LinearLayoutManager为最简单的layout manager,即线性布局管理 LinearLayoutManager有横向和纵向两种方向 扩展阅读 错开位置的网格式layout manager CardView的API说明
方法onCreateViewHolder 直接创建一种可复用的VH或者根据viewType创建多种VH。 方法onBindViewHolder 数据和VH通过位置position绑定 方法getItemCount 返回有多少条数据 ViewHolder 同样是一个抽象类,我们通过继承此类实现view的封装。 LayoutManager 布局管理器,RecylerView中数据显示布局方式。目前v7包种提供了三种模式,分别是LinearLayoutManager
RecyclerView 是 ListView的进化 ·RecyclerView使用布局管理器管理子view的位置(目前尚只提供了LinearLayoutManager),也就是说你再不用拘泥于ListView的线性展示方式,如果之后提供其他custom LayoutManager的支持,你能够使用复杂的布局来展示一个动态组件。 ·自带了ItemAnimation,可以设置加载和移除时的动画,方便做出各种动态浏览的效果。 版权声明:本文为博主原创文章,未经博主允许不得转载。
老规矩,先上图: 单行下拉刷新以及上拉加载更多: 多行下拉刷新和上拉加载更多【布局使用的上面那个,不要在意这个ORZ】: 自动加载也有接口监听,你可以自己去实现: 文件依赖包如下: 其中LinearLayoutManager,GridLayoutManager使用了这个开源项目的部分代码: /wangjiegulu/AndroidBucket/tree/master/src/com/wangjie/androidbucket/support/recyclerview 下载地址:http://download.csdn.net/detail/u37873 版权声明:本文为博主原创文章,未经博主允许不得转载。
android.support.v7.widget.RecyclerV
import com.ttdevs.utils.LogU
* RecyclerView加载更多的类,支持LinearLayoutManager和GridLayoutManager
* RecyclerView.addOnScrollListener(new OnRecyclerLoadMoreListener(){
public void onLoadMore
感觉5.0以后RecyclerView基本上能完成替代listView,gridview之类的了。 必须设置布局管理,以及RecyclerView.adapter才可以正常显示。 &span style="font-size:18"&LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false
" android:layout_height="match_parent" android:scrollbars="vertical" /& // 创建一个线性布局管理器 LinearLayoutManager layoutManager = new LinearLayoutManager(this); // 设置布局管理器 recyclerView.setLayoutManager(layoutManager); // 创建数据集 String[] dataset = new String
); mRecyclerView.setAdapter(mAdapter);
/************水平ListView效果****************************************/ LinearLayoutManager ll=new LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, true);
mRecyclerView.setLayoutManager(ll
//mLayoutManager.scrollToPosition(lastPosition);
//这样更精确
((LinearLayoutManager)mLayoutManager).scrollToPositionWithOffset(lastPosition, lastOffset); 版权声明:本文为博主原创文章,未经博主允许不得转载。
TestAdapter(this, mDatas); mRecyclerView.setAdapter(mAdapter); LinearLayoutManager ll = new LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, false); mRecyclerView.setLayoutManager(ll); } @Override public boolean onCreateOptionsMenu(Menu
initHorizaontal();
initVertical();
private void initHorizaontal() {
RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recyclerview_horizontal);
// 创建一个线性布局管理器
LinearLayoutManager layoutManager = new
ButterKnife.inject(this);
mListView.setLayoutManager(new LinearLayoutManager(this));
mListView.setAdapter(new MAdapter(this));
new Thread(runnable).start();
Handler demoHandler=new Handler(){
1、引言 用Android提供的support包里的SwipeRefreshLayout和RecyclerView同时使用的时候会出现RecyclerView的item被裁剪的情况,如下图所示: 2、解决此Bug的方法 参考资料如下: 链接地址 链接地址 上面显示的是两种解决办法,我推荐第二种比较简单,我的代码片段如下: mLayoutManager = new LinearLayoutManager(getActivity());
//mPicListView是RecyclerView
& 2012 - 2016 &
&All Rights Reserved. &
/*爱悠闲图+*/
var cpro_id = "u1888441";从头开始学 RecyclerView(六) LayoutManager
时间: 22:58:56
&&&& 阅读:127
&&&& 评论:
&&&& 收藏:0
标签:&&&&&&&&&&&&&&&&&&&&&&&&&&&前言
在前面的文章中,每个示例,都使用了LayoutManager,毕竟它是RecyclerView不可缺少的一部分。
LayoutManager,顾名思义,就是『布局管理器』。
使用如下代码,设置RecyclerView的LayoutManager:
mRecyclerView.setLayoutManager(layoutManager)
已提供的LayoutManager
android.support.v7.widget.LinearLayoutManager
android.support.v7.widget.GridLayoutManager
android.support.v7.widget.StaggeredGridLayoutManager
LinearLayoutManager
线性 水平或垂直 布局
构造函数如下:
public LinearLayoutManager(Context context) {
this(context, VERTICAL, false);
public LinearLayoutManager(Context context, int orientation, boolean reverseLayout) {
setOrientation(orientation);
setReverseLayout(reverseLayout);
setAutoMeasureEnabled(true);
public LinearLayoutManager(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
第1个中,内部使用了第2个。第3个是xml中配置时使用的。实现跟第2个的实现类似。这里就解释下第2个构造方法中的参数意义:
orientation —— 取值 LinearLayoutManager.HORIZONTAL,表示水平方向;取值 LinearLayoutManager.VERTICAL,表示垂直方向
reverseLayout —— 是否需要布局反转。true,表示需要:若是方向为HORIZONTAL,则内容会从右到左显示,滚动方向也是;同样,方向为VERTICAL时,则内容会从下向上显示,滚动方向也是
GridLayoutManager
网格布局。
构造函数如下:
public GridLayoutManager(Context context, int spanCount) {
super(context);
setSpanCount(spanCount);
public GridLayoutManager(Context context, int spanCount, int orientation, boolean reverseLayout) {
super(context, orientation, reverseLayout);
setSpanCount(spanCount);
public GridLayoutManager(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {…}
由于GridLayoutManager 继承了 LinearLayoutManager,所以构建函数中的参数意思差不多。
主要说下参数 spanCount 意义:在方向为HORIZONTAL时,spanCount就表示有几行;在方向为VERTICAL时,spanCount就表示有几列
交错的网格布局。
构造函数如下:
public StaggeredGridLayoutManager(int spanCount, int orientation){
mOrientation =
setSpanCount(spanCount);
setAutoMeasureEnabled(mGapStrategy != GAP_HANDLING_NONE);
mLayoutState = new LayoutState();
createOrientationHelpers();
public StaggeredGridLayoutManager(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {…}
StaggeredGridLayoutManager 继承了 GridLayoutManager。参数意义与GridLayoutManager类似。
要实现交错式,除了设定RV的layoutManger为StaggeredGridLayoutManager外,还要设置item的宽或高的尺寸。
当方向为HORIZONTAL时,spanCount表示总的行数,这时为item设置不一样的宽度,即有横向交错的感觉。
当方向为HORIZONTAL时,spanCount表示总的列数,这时为item设置不一样的高度,即有纵向交错的感觉。
如果只是对item设置LayoutParams,那么还需要相应的设置item的内容view的LayoutParams。所以如果可以,直接改变item内容view的LayoutParams即可
关于改变宽或高的示例代码:
public void bindCustomViewHolder(BaseHolder holder, int position) {
holder.itemView.setFocusable(true)
TextView tvTitle = holder.getView(R.id.tv_title)
tvTitle.setText(getItem(position))
View vImg = holder.getView(R.id.v_img)
vImg.setBackgroundColor(getColor())
if (mIsStaggered) {
float size = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 100, getResources().getDisplayMetrics())
int w = mOrientation == LinearLayoutManager.HORIZONTAL ? (int)size : -1
int h = mOrientation == LinearLayoutManager.HORIZONTAL ? -1 : (int)size
if (mOrientation == LinearLayoutManager.HORIZONTAL) {
w = (int) (size + Math.random() * size)
h = (int) (size + Math.random() * size)
holder.itemView.setLayoutParams(new RecyclerView.LayoutParams(w, h))
vImg.setLayoutParams(new RelativeLayout.LayoutParams(w, h))
注:由于这里设置成宽高随机值,所以每次重新滑动到开始位置时,都会重新布局。如果给一个定长就不会了:
if (position % 2 == 1) {
w = w / 2;
示例详情:
标签:&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&国之画&&&& &&&&chrome插件&&
版权所有 京ICP备号-2
迷上了代码!拒绝访问 |
| 百度云加速
请打开cookies.
此网站 () 的管理员禁止了您的访问。原因是您的访问包含了非浏览器特征(3af8f5db707e4394-ua98).
重新安装浏览器,或使用别的浏览器Android如何自定义RecyclerView的LayoutManager - 简书
Android如何自定义RecyclerView的LayoutManager
如果有需要自定义的同学基本都已经能熟悉使用,在此笔者就不再赘述如何使用了。
首先笔者编写了一个简单的demo用来展示使用包自带的的效果。
这部分代码可以在找到,检出tag为1.0.0的版本运行即可运行后如下图
device--145618.png
可以看到笔者对item的大小进行的修改,但是仍然每一行只显示一个item,这是的布局策略。
public void onBindViewHolder(DemoViewHolder holder, int position) {
holder.itemView.getLayoutParams().width = (self.getDemoModels().get(position).getPreferWidth());
holder.itemView.getLayoutParams().height = (self.getDemoModels().get(position).getPreferHeight());
holder.setDelegate(self);
holder.reload(self);
接下来我们开始创建一个自定义的CustomLayoutManager,先预设一下想要的效果,为了简单实现,笔者自定义的CustomLayoutManager会进行斜线布局,即从容器左上角开始放置item,下一个item的左上角坐标对应上一个item的右下角坐标。
public class CustomLayoutManager extends RecyclerView.LayoutManager {
/** Convenience Var to call this */
final CustomLayoutManager self =
public void onLayoutChildren(RecyclerView.Recycler recycler, RecyclerView.State state) {
detachAndScrapAttachedViews(recycler); // 分离所有的itemView
int offsetX = 0;
int offsetY = 0;
for (int i = 0; i & getItemCount(); i++) {
View scrap = recycler.getViewForPosition(i); // 根据position获取一个碎片view,可以从回收的view中获取,也可能新构造一个
addView(scrap);
measureChildWithMargins(scrap, 0, 0);
// 计算此碎片view包含边距的尺寸
int width = getDecoratedMeasuredWidth(scrap);
// 获取此碎片view包含边距和装饰的宽度width
int height = getDecoratedMeasuredHeight(scrap); // 获取此碎片view包含边距和装饰的高度height
layoutDecorated(scrap, offsetX , offsetY, offsetX + width, offsetY + height); // Important!布局到RecyclerView容器中,所有的计算都是为了得出任意position的item的边界来布局
offsetX +=
offsetY +=
public RecyclerView.LayoutParams generateDefaultLayoutParams() {
return new RecyclerView.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
如以上代码所示,继承必须override方法,以及为了布局必须实现。
在笔者计算了所有item的尺寸并将所有item都摆放到了中。效果图如下
device--104053.png
这部分代码可以在找到,检出tag为1.0.0的版本运行即可可以看到这个效果确实实现了预定目标,斜线摆放。然而这里有两个问题
没有实现重用
重用机制是的主要性能提升点,如果没有实现重用使用就没有意义了。上例中如果有50个item,就会有50个view,其中大部分view的坐标都在屏幕外没有必要显示。
滑动也是在大部分情况下应有的功能,因为主要是为了解决在较小容器中展示大量数据的问题。滑动在是比较特别的,本身并不执行scroll,例如一个的高度为100,如果一个item的坐标为(0,100),大小为(100, 100),这个item将被摆放到容器外部。在中若想显示这个item,其流程是获取用户滑动手势,判断是否支持横向或纵向滑动,若支持则传递信息给,由对item进行平移(也可能是其他操作),而后按照重用机制应当回收容器外部的item,添加新进入容器的item。
接下来笔者就开始进一步优化,实现重用和横向纵向滑动功能。优化后的代码比较长,笔者已经在代码中做好的注释,读者可以查看,检出tag为1.0.2的版本运行,也可以在github直接阅读。
基本原理是这样的:
在每一次重新对item布局时(item信息改变时),计算每个item的坐标尺寸记录下来,如果一个item的坐标尺寸与当前显示区域矩阵相交就展示这个item,否则回收这个item。显示区域有滑动偏移量和容器大小决定,每次滑动时都要进行重新布局。
感谢阅读。
路边的野怪}

我要回帖

更多关于 layoutmanager 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信