使用RecyclerView实现瀑布流,仿照小红书,解决顶部留白、卡顿等问题
一、最终效果:
二、工程结构框架:
三、核心实现:
(1)、实现RecyclerView控件的适配器类
主要就是实现下面三个函数的重载:
@NonNull@Overridepublic RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {View itemView = LayoutInflater.from(mContext).inflate(R.layout.item_layout, parent, false);return new NormalHolder(itemView);}@Overridepublic void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {NormalHolder normalHolder = (NormalHolder) holder;normalHolder.mTitle.setText(mDatas.get(position).title);normalHolder.mUserName.setText(mDatas.get(position).userName);normalHolder.mHits.setText(mDatas.get(position).hits.toString());Class drawable = R.drawable.class;Field field = null;try {field = R.mipmap.class.getDeclaredField(mDatas.get(position).mainPic);int mainPicId = field.getInt(field.getName());WindowManager wm = (WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE);DisplayMetrics dm = new DisplayMetrics();wm.getDefaultDisplay().getMetrics(dm);int width = dm.widthPixels; // 屏幕宽度(像素)int height = dm.heightPixels; // 屏幕高度(像素)float density = dm.density; // 屏幕密度(0.75 / 1.0 / 1.5)int densityDpi = dm.densityDpi; // 屏幕密度dpi(120 / 160 / 240)// 屏幕宽度算法:屏幕宽度(像素)/屏幕密度int screenWidth = (int) (width / density); // 屏幕宽度(dp)int screenHeight = (int) (height / density);// 屏幕高度(dp)ViewGroup.LayoutParams lp = normalHolder.mMainPic.getLayoutParams();int wArea = (int)((screenWidth - 30) / 2 * density); // 20dp是布局文件设定的边距Bitmap bmp = BitmapFactory.decodeResource(mContext.getResources(), mainPicId);int wBitmap = bmp.getWidth();int hBitmap = bmp.getHeight();double dRate = wArea / (double)wBitmap;int hArea = (int)(hBitmap * dRate);lp.width = wArea;lp.height = hArea;normalHolder.mMainPic.setLayoutParams(lp);normalHolder.mMainPic.setMaxHeight(wArea * 5);normalHolder.mMainPic.setImageResource(mainPicId);field = R.drawable.class.getDeclaredField(mDatas.get(position).headImage);int headImageId = field.getInt(field.getName());normalHolder.mHeadImg.setImageResource(headImageId);} catch (NoSuchFieldException | IllegalAccessException e) {e.printStackTrace();}}@Overridepublic int getItemCount() {return mDatas.size();}
(2)、应用瀑布流来布局
generateDatas(); // 产生模拟数据RecyclerView mRv = findViewById(R.id.userList);// 布局StaggeredGridLayoutManager layoutManager = new StaggeredGridLayoutManager(2, StaggeredGridLayoutManager.VERTICAL);layoutManager.setGapStrategy(StaggeredGridLayoutManager.GAP_HANDLING_NONE); //防止item 交换位置mRv.setLayoutManager(layoutManager);
(3)、放置拖动过程中顶部出现空白
mRv.addOnScrollListener(new RecyclerView.OnScrollListener() {@Overridepublic void onScrollStateChanged(RecyclerView recyclerView, int newState) {super.onScrollStateChanged(recyclerView, newState);//防止第一行到顶部有空白区域layoutManager.invalidateSpanAssignments();}});
(4)、图片实现了轻量级的圆角处理,可以实现部分圆角化。
由类NiceImageView来实现图片圆角。
(5)、实现了放置item位置发生变化,同时将图片资源放到midmap里,有效放置拖动过程中的卡顿。
四、源码下载:
可以去这里下载:https://www.kbase12.com/android/doc/detail?id=ef594c604cf9498a8b73609e6665d3ae
欢迎有兴趣的朋友一起交流。
使用RecyclerView实现瀑布流,仿照小红书,解决顶部留白、卡顿等问题相关推荐
- 微信小程序实现瀑布流 仿小红书
要做的小红书瀑布流效果 homepage.wxml代码 <!-- 瀑布流大概的思路就是,直接定义两列等宽的view,然后两列都加载相同的数据wx:if="{{index%2==1}}& ...
- RecyclerView实现瀑布流,图片自适应高度
话不多说,先上效果图 对于RecyclerView,相信大家都不陌生了,这个集listView,GridView,瀑布流效果与一身强大控件,渐渐地渗透在每个App.... 还是回到正题,如何让Recy ...
- 怎样判断小红书被限流?小红书被限流有这几大表现
屏幕前的各位小伙伴们,你们遇到过小红书账号被限流的情况吗? 说到小红书被限流,可能很多小伙伴都不太清楚什么情况就做账号限流,今天伯乐网络传媒就来给大家分享下怎样判断小红书被限流?小红书被限流的表现有哪 ...
- SwipeRefreshLayout+CardView+RecyclerView 精美瀑布流效果
博主声明: 转载请在开头附加本文链接及作者信息,并标记为转载.本文由博主 威威喵 原创,请多支持与指教. 本文首发于此 博主:威威喵 | 博客主页:https://blog.csdn.net/ ...
- 【RecyclerView】 五、RecyclerView 布局 ( 瀑布流 | 交错网格局管理器 StaggeredGridLayoutManager )
文章目录 一.交错网格局管理器 StaggeredGridLayoutManager ( 瀑布流 ) 二.交错网格局管理器默认设置 三.交错网格局管理器水平方向设置 四.完整代码示例 五.Recycl ...
- android 水平方向瀑布流,Android RecyclerView(瀑布流)水平/垂直方向分割线
Android RecyclerView(瀑布流)水平/垂直方向分割线 Android RecyclerView不像过去的ListView那样随意的设置水平方向的分割线,如果要实现Recycle ...
- 友盟登陆传值+OkHttp+recyclerview展示瀑布流+跳转Intent传值+属性动画
友盟详情见 https://blog.csdn.net/aijaijgnaw/article/details/84203936 分包 友盟第三方登录 MyApp(Application) packag ...
- 使用RecyclerView实现瀑布流
准备工作 添加网络权限,在此项目中用于获取网络图片 添加Glide依赖,用于加载图片 启用dataBinding,也可不用dataBinding,这里主要是练习一下 implementation 'c ...
- RecyclerView StaggeredGridLayoutManager瀑布流实现中遇到的问题
1.下面的代码主要是用于布局错乱后,自动修复,以及防止item左右交换的问题.在我遇到的问题当中,如果只setGapStrategy,会导致列表往回滑动时,顶部出现空白的问题.所以需要开启系统自动计算 ...
最新文章
- python书籍_python书籍购买建议
- 单列集合List的实现类
- 白噪声检测_科学家尝试用智能扬声器的白噪声来监测婴儿的呼吸运动
- Hyperledger下子项目
- Win11系统安装教程 教你安装原版Win11系统
- summit超级计算机gpu温度,揭秘Summit:加速计算赋力全球最快超级计算机
- 三层交换技术与链路聚合
- 下个时代的前端研发,效率还能提升。PxCook 3.0,最高效的设计研发利器
- Windows 10 出现问题但您可以重试 MSA【closed】
- REST API 是什么?
- Activiti in Action(实战Activiti)-目录
- 全球混合现实产业引领者 孙立
- python 答题插件_大话西游答题器 Python版本
- Android 6.0 Marshmallow
- Premiere Pro之时间轴面板(二)
- MATLAB中能对三角函数降幂嘛,初中数学三角函数降幂公式
- 手机录屏并转换成gif动图
- 【Python】打印出所有的“水仙花数”
- Oracle 、SQL多字段分组统计
- web前端学习笔记(二)