android 瀑布流布局(android 瀑布流怎么底部对齐)
本文目录
- android 瀑布流怎么底部对齐
- RecyclerView详解(四):LayoutManager布局管理器
- android 瀑布流条目错乱解决方法
- Android实现自动滚动的瀑布流怎么实现
- 1.Android recycleView万能分隔线 GridLayoutManager布局item左右间距均等(最易懂)
android 瀑布流怎么底部对齐
点击手机下端左侧键,点桌面设置,关闭瀑布流
android:gravity="center_horizontal"
RecyclerView详解(四):LayoutManager布局管理器
LayoutManager是一个抽象类,有3个子类:
LinearLayoutManager : 线性布局管理器 GridLayoutManager : 表格布局管理器 StaggeredGridLayoutManager : 瀑布流布局管理器
LinearLayoutManager 是线性布局管理器,使用频率是最高的,展示的样式跟listview一模一样。 该类有3个构造方法:
第一个构造方法内部调用了第二个构造方法,第二个构造方法参数的含义:
orientation也可以通过manger.setOritation()设置 reverseLayout,也可以通过manager.setReverseLayout()设置。 setStackFromEnd(boolean stackFromEnd) 当设置为true时,列表便会从底部开始展示内容,RecycelrView会自动滑倒尾部。 这个方法和manager.setReverseLayout(true)共同点就是都自动滑动尾部,RecyclerView默认会展示末尾的item。差别在于,manager.setStackFromEnd(true)不会影响内部的数据顺序,怎么添加进Adapter的,就怎么展示。
scrollToPosition(int position) 滑动到指定item linearLayoutManager.scrollToPositionWithOffset(int position,int offset) 滑动到指定item,在这个基础上,又附加偏移了offset的距离。
获取当前RecyclerView首尾可见item的位置方法
这4个方法,只有当RecyclerView在屏幕展示出来后,才能得到正常的返回值,否则都是-1
该管理器继承LinearLayoutManager,也有3个构造方法,由于是继承LiearLayoutMnager,使用起来差别不大,构造方法内使用了super()方法来直接调用了父类的构造方法:只是构造函数会多一个参数 spanCount : 列数 根据方法的注释,可以知道,默认情况下,GridLayoutManager是垂直的。在方法内,列数是调用setSpanCount(spanCount)进行设置。如果GridLayoutManager是水平的,则spanCount 代表行数,这个还是很容易理解。 GridLayoutManager不支持setStackFromEnd(),但支持setReverseLayout(boolean)方法。其他LinearLayoutManager的方法在上面已经提过了,就不重复了。
这里我们spanCount 设置为3,效果如下图
构造函数StaggeredGridLayoutManager(int spanCount, int orientation) 意思和GridLayoutManager一样。使用也是一样。这边就不具体表现讲了,看效果
使用这3个布局管理器,差不多90%的需求都能满足吧,LayoutManager也可以自定义实现,后面有用在进行详细讨论,这边仅说简单的使用。
***隐藏网址***
android 瀑布流条目错乱解决方法
条目错乱是由于每个item里图片宽高不确定导致的,所以首先需要设置 layoutManager.setGapStrategy(StaggeredGridLayoutManager.GAP_HANDLING_NONE) 这个属性,不自动刷新间隔 第一种方式就是在请求完成数据之后获取宽高,然后设置给每个item 第二种方式,在第一次加载item时,记录图片的宽高,但是这样在滑动到顶部是可能会出现顶部留白的问题,所以要重写recyclerview的onscrollstatechangelistener方法,在加载第一行的条目时调用layoutmanager.invalidateSpanAssignments();
Android实现自动滚动的瀑布流怎么实现
1、酷派手机左边第一个桌面就是瀑布流(新闻桌面),这个其实用处不大,而且更新还费流量。点手机左键,打开桌面管理。
2、此时,会发现除了瀑布流之处。其余的桌面都可以删除。
3、那如何删除呢,打开应用窗口,可以看到右上角有个“酷秀”的图标,点击打开
4、进入后,再点右上角的“设置”按键(或者向右滑动),此时就可以看到菜单中有个“显示瀑布流”的勾选项,把勾选去掉便可以,然后退回到主屏再看看效果
1.Android recycleView万能分隔线 GridLayoutManager布局item左右间距均等(最易懂)
今天开始讲RecycleView的系列教程。分割线,分组,局部刷新,动态添加,缓存原理,抖音效果,瀑布流。嵌套,动画等等RecyclerView的分割线是通过canvas和设置item偏移画出来的.需要知道2个方法 getItemOffsets()和onDraw方法 getItemOffsets 是针对每一个 ItemView onDraw:遍历,进行颜色修改 我们可以看到自定义的 TestDividerItemDeoration 只实现了一个方法 getItemOffsets()。方法里面有四个参数。 Rect outRect View view RecyclerView parent RecyclerView.State state 绿色区域代表 RecyclerView 中的一个 ItemView,而外面橙色区域也就是相应的 outRect,也就是 ItemView 与其它组件的偏移区域,等同于 margin 属性,通过复写 getItemOffsets() 方法,然后指定 outRect 中的 top、left、right、bottom 就可以控制各个方向的间隔了。 这实现了简单的分隔线效果,但这种方法分隔线的效果只能取决于背景色,如果我要定制分割线的颜色呢?这个时候就要 onDraw()。 ———————————————— 源码分析:在recycleview中的 分割线要注意,没有颜色,默认是白色的,会看不出来 第一种方案,通过 getItemOffsets()方法进行分割线! 判断是否是第一个,最后一个,是单个还是双个,是什么类型 /*** * 分割线要注意,没有颜色,默认是白色的,会看不出来 * @param outRect * @param view * @param parent * @param state */ private void testItemOffset(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) { int childAdapterPosition = parent.getChildAdapterPosition(view); if (childAdapterPosition ==0) { outRect.set(0, 20, 0, 20); }else { outRect.set(0, 0, 0, 20); } } 第二种方案:ondraw() @Override public void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state) { super.onDraw(c, parent, state); int childCount = parent.getChildCount(); for (int i =0; i 《 childCount; i++) { View view = parent.getChildAt(i); int index = parent.getChildAdapterPosition(view); //第一个ItemView不需要绘制 if (index ==0) { continue; } float dividerTop = view.getTop() -mDividerHeight; float dividerLeft = parent.getPaddingLeft(); float dividerBottom = view.getTop(); float dividerRight = parent.getWidth() - parent.getPaddingRight(); c.drawRect(dividerLeft, dividerTop, dividerRight, dividerBottom, mPaint); } } GridLayoutManager布局item左右间距均等 思路分析 首先,我们知道,对于 GridLayoutmanager ,当我们设置的 spancount 为 3 的时候,那么每个 item 的最大宽度为 itemMaxW = recycylerW / spancount = recycylerW / 3. 假设我们 spancount 为 3,那么在不设置 itemDercation 的情况下它的分布是这样的,可以看到第一列与最后一行的距离是不一样的 GridVIew出现的问题:本来固定item.高度和宽度 1.分割线有,不是理想的,左右均等 2.上下没有分割线源码得到: 按上面分析的源码,我们可以知道,调用outRect.set(int left, int top, int right, int bottom)方法时,left一直为0,right一直为divider的宽度,而每一项item的宽度都要减去(left+right)大小, left一直为0,right一直为divider的宽度 左上右下到底是什么的值? 计算每一个item移动的距离,左边和右边的移动距离 计算分析: 1.左边的分割线宽度为sW (已知) 2.每个显示item的宽度,布局定义的itemWidth 3. 总共分割线宽度:totalDivider=屏幕宽度-spanCount*itemWidth 4.列之间的分割线宽度为dw =(屏幕宽度-spanCount*item-2*sW )/(spantcount-1) 5.每个item需要留出的空间 ew=totalDivider/spanCount(即paddingLeft+paddingRight) left: 左边的间距值(绝对值,差值) right:右边的间距值 每个item移动的距离: 第一个Item:L0=sW R0=eW-sW 第二个Item:L1=dW-R0=dW-eW+sW R1=eW-L1=2eW-dW-sW 第三个Item:L2=dW-R1=2(dW-eW)+sW R2=eW-L2=3eW-2dW-sW 得出公式: Ln=(position%spanCount)*(dw-ew)+sw Rn=ew-Ln 总结:得到3个值dw,ew, sw的值 sw:左边的距离 ew:每个的平均的分割线 dw: 列之间的分割线宽度 int firstLastSpace =50;//最左边的分割线宽度 @SuppressLint("LongLogTag") @Override public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) { super.getItemOffsets(outRect, view, parent, state); count++; outRect.top =20; mDividerHeight =0; int itemWidth =dip2px(context, 100); int screenWidth = getScreenWidth(context); int dw = (screenWidth -3 * itemWidth -2 *firstLastSpace) /2;//最终计算出这个padding值 //误区:中间的分割线的总距离,左右可能是不等的 int totalDivder = screenWidth -3 * itemWidth; Log.d("TestDividerItemDecoration", "totalDivder" + totalDivder); int eachDivder = totalDivder /3; int itemPosition = ((RecyclerView.LayoutParams) view.getLayoutParams()).getViewLayoutPosition(); //不要用for循环 outRect.left = (itemPosition %3) * (dw - eachDivder) +firstLastSpace; outRect.right = eachDivder - outRect.right; } 错误的思路: //误区:中间的分割线的总距离,左右可能是不等的 //不要用for循环 int firstLastSpace =50;//最左边的分割线宽度 @SuppressLint("LongLogTag") @Override public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) { super.getItemOffsets(outRect, view, parent, state); count++; outRect.top =20; mDividerHeight =0; int itemWidth =dip2px(context, 100); int screenWidth = getScreenWidth(context); int padding = (screenWidth -3 * itemWidth -2 *firstLastSpace) /4;//最终计算出这个padding值 //不能这么算,必须保证每个item的分割线一样才行。 Log.d("TestDividerItemDecoration", "getItemOffsets" +count +"item宽度:" + itemWidth +"padding" + padding); //仅仅计算左边和右边的距离 int childCount = parent.getChildCount(); for (int i =0; i 《 childCount; i++) { if (i %3 ==0) {//最左边的item outRect.left =firstLastSpace; outRect.right = padding; }else if (i %3 ==1) { outRect.left = padding; outRect.right = padding; }else if (i %3 ==2) { outRect.left = padding; outRect.right =firstLastSpace; } } } 瀑布流的设置: int spanIndex = layoutParams.getSpanIndex(); public class FeedDecorationextends RecyclerView.ItemDecoration { private HomePageCardAdaptermHomePageCardAdapter; public FeedDecoration(HomePageCardAdapter mHomePageCardAdapter) { this.mHomePageCardAdapter = mHomePageCardAdapter; } @Override public void getItemOffsets(@NonNull Rect outRect, @NonNull View view, @NonNull RecyclerView parent, @NonNull RecyclerView.State state) { if (mHomePageCardAdapter ==null) { return; } if (mHomePageCardAdapter.getItemViewType(parent.getChildAdapterPosition(view)) == HomePageMultipleCard.HOMEPAGE_MULTIPLE_CARD_TYPE_FITNESS_FEED) { StaggeredGridLayoutManager.LayoutParams layoutParams = (StaggeredGridLayoutManager.LayoutParams) view.getLayoutParams(); int spanIndex = layoutParams.getSpanIndex(); if (spanIndex ==0) { outRect.set(DensityUtil.dip2px(ShadowApp.context(), 14), 0, DensityUtil.dip2px(ShadowApp.context(), 5), DensityUtil.dip2px(ShadowApp.context(), 10)); }else { outRect.set(DensityUtil.dip2px(ShadowApp.context(), 5), 0, DensityUtil.dip2px(ShadowApp.context(), 14), DensityUtil.dip2px(ShadowApp.context(), 10)); } } } }***隐藏网址***
更多文章:
同城游大厅安卓手机版(同城游戏大厅官方下载六副够级纸牌手机版)
2024年5月28日 00:39
百度资源搜索资源平台(百度搜索资源平台,提交网站后,验证不了)
2024年8月24日 09:37
VR小忍计划怎么打开?有人说“小忍是一种修养,大忍则有一种企图”你认同这句话吗为什么
2024年5月6日 01:09
惠普p1007打印机驱动安装(HP LaserJet P1007怎么安装)
2024年7月16日 13:05
explorer exe(win10开机出现explorer.exe)
2024年6月18日 11:06
英语语音翻译在线(有没有一种软件就是我说中文就能立刻翻译成英文,最好是语音的)
2024年9月2日 05:05
getelementsbytagname(JavaScript:怎么获得页面元素的id和name值)
2024年7月11日 06:59