RecyclerView实现瀑布流效果(二)
在上篇中我们知道RecyclerView中默认给我们提供了三种布局管理器,分别是LinearLayoutManager、GridLayoutManager、StaggeredGridLayoutManager。其中StaggeredGridLayoutManager可实现交错式网格布局,正好可以用来实现瀑布流。
下面先看看效果图吧,再贴代码:
其中大部分内容实现其实是和上篇文章是一样的,就不多叙述了,就一个地方不同,就是我们在适配器中绑定ViewHolder的方法中需要重新给我们的itemView布局设置height,我这里是生成随机数来设置高度的,代码实现为:
private void getRandomHeight(List<String> lists){//得到随机item的高度 heights = new ArrayList<>(); for (int i = 0; i < lists.size(); i++) { heights.add((int)(200+Math.random()*400)); } }
在onBindViewHolder方法中:
ViewGroup.LayoutParams params = holder.itemView.getLayoutParams();//得到item的LayoutParams布局参数 params.height = heights.get(position);//把随机的高度赋予itemView布局 holder.itemView.setLayoutParams(params);//把params设置给itemView布局
从而实现瀑布流效果。
贴一下代码吧:
MainActivity.java
public class MainActivity extends AppCompatActivity { private RecyclerView mRecyclerView; private List<String> lists; private MyRecyclerAdapter adapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initData(); mRecyclerView = (RecyclerView) this.findViewById(R.id.recyclerView); mRecyclerView.setItemAnimator(new DefaultItemAnimator()); // mRecyclerView.addItemDecoration();//设置分割线 mRecyclerView.setLayoutManager(new StaggeredGridLayoutManager(2, StaggeredGridLayoutManager.VERTICAL));//设置RecyclerView布局管理器为2列垂直排布 adapter = new MyRecyclerAdapter(this,lists); mRecyclerView.setAdapter(adapter); adapter.setOnClickListener(new MyRecyclerAdapter.OnItemClickListener() { @Override public void ItemClickListener(View view, int postion) { Toast.makeText(MainActivity.this,"点击了:"+postion,Toast.LENGTH_SHORT).show(); } @Override public void ItemLongClickListener(View view, int postion) { //长按删除 lists.remove(postion); adapter.notifyItemRemoved(postion); } }); } private void initData() { lists = new ArrayList(); for (int i = 0; i < 100; i++) { lists.add("" + i); } } }
MyRecyclerAdapter.java
public class MyRecyclerAdapter extends RecyclerView.Adapter<MyViewHolder> { private List<String> lists; private Context context; private List<Integer> heights; private OnItemClickListener mListener; public MyRecyclerAdapter(Context context,List<String> lists) { this.context = context; this.lists = lists; getRandomHeight(this.lists); } private void getRandomHeight(List<String> lists){//得到随机item的高度 heights = new ArrayList<>(); for (int i = 0; i < lists.size(); i++) { heights.add((int)(200+Math.random()*400)); } } public interface OnItemClickListener{ void ItemClickListener(View view,int postion); void ItemLongClickListener(View view,int postion); } public void setOnClickListener(OnItemClickListener listener){ this.mListener = listener; } @Override public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View view = LayoutInflater.from(context).inflate(R.layout.item,parent,false); MyViewHolder viewHolder = new MyViewHolder(view); return viewHolder; } @Override public void onBindViewHolder(final MyViewHolder holder, int position) { ViewGroup.LayoutParams params = holder.itemView.getLayoutParams();//得到item的LayoutParams布局参数 params.height = heights.get(position);//把随机的高度赋予item布局 holder.itemView.setLayoutParams(params);//把params设置给item布局 holder.mTv.setText(lists.get(position));//为控件绑定数据 if(mListener!=null){//如果设置了监听那么它就不为空,然后回调相应的方法 holder.itemView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { int pos = holder.getLayoutPosition();//得到当前点击item的位置pos mListener.ItemClickListener(holder.itemView,pos);//把事件交给我们实现的接口那里处理 } }); holder.itemView.setOnLongClickListener(new View.OnLongClickListener() { @Override public boolean onLongClick(View v) { int pos = holder.getLayoutPosition();//得到当前点击item的位置pos mListener.ItemLongClickListener(holder.itemView,pos);//把事件交给我们实现的接口那里处理 return true; } }); } } @Override public int getItemCount() { return lists.size(); } } class MyViewHolder extends RecyclerView.ViewHolder{ TextView mTv; public MyViewHolder(View itemView) { super(itemView); mTv = (TextView) itemView.findViewById(R.id.textView); } }
源码下载地址:http://download.csdn.net/detail/u010687392/8868745
【注】:我们在使用RecyclerView时,更多的是通过网络请求得到数据,比如在加载图片或者列表项时,我们往往需要判断当前屏幕上显示的第一个item的postion是多少,最后一个item的postion是多少,当前屏幕共显示了几个item项,如果使用ListView或者GridView来判断当然好判断,只要实现AbsListView.OnScrollListener这个接口就可以得到,那么在RecyclerView中如何得到呢?RecyclerView中只提供了一个滚动监听器addOnScrollListener,并且不能实现AbsListView.OnScrollListener这个接口,那怎么获取呢?就是通过RecyclerView中的LayoutManager,我们使用RecyclerView时候都必须设置一个LayoutManager布局管理器,通过它我们可以轻松的得到当前屏幕共有几个item,第一个item的postion等数据,即:
int firstIndex = mLayoutManager.findFirstVisibleItemPosition();//返回当前屏幕第一个显示的item的postion int firstComIndex = mLayoutManager.findFirstCompletelyVisibleItemPosition();//返回当前屏幕第一个完全显示的item的postion int lastIndex = mLayoutManager.findLastVisibleItemPosition();//返回当前屏幕最后一个显示的item的position int lastComIndex = mLayoutManager.findLastCompletelyVisibleItemPosition();//返回当前屏幕最后一个完全显示的item的posion View view = mLayoutManager.findViewByPosition(int postion);//返回对应postion的itemView
RecyclerView实现瀑布流效果(二)的更多相关文章
- [Android Pro] RecyclerView实现瀑布流效果(二)
referece to : http://blog.csdn.net/u010687392 在上篇中我们知道RecyclerView中默认给我们提供了三种布局管理器,分别是LinearLayoutMa ...
- RecyclerView实现瀑布流效果(图文详解+源码奉送)
最近有时间研究了一下RecyclerView,果然功能强大啊,能实现的效果还是比较多的,那么今天给大家介绍一个用RecyclerView实现的瀑布流效果. 先来一张效果图: 看看怎么实现吧: 整体工程 ...
- 实现RecyclerView下拉刷新和上拉加载更多以及RecyclerView线性、网格、瀑布流效果演示
实现RecyclerView下拉刷新和上拉加载更多以及RecyclerView线性.网格.瀑布流效果演示 效果预览 实例APP 小米应用商店 使用方法 build.gradle文件 dependenc ...
- 初步使用RecyclerView实现瀑布流
先看效果 关于RecyclerView,真的是很强大. 个人觉得主要方便的地方是 1.直接可以设置条目布局,通过setLayoutManager LinearLayoutManager:线性布局,横向 ...
- RecylerView完美实现瀑布流效果
RecylerView包含三种布局管理器,分别是LinearLayoutManager,GridLayoutManager,StaggeredGridLayoutManager,对应实现单行列表,多行 ...
- 利用JS实现简单的瀑布流效果
哈哈, 我又来啦, 在这一段时间里, 我简单的学习了一下javascript(JS), 虽然不是很懂啦, 但是我也简单的尝试着做了点小东西, 就比如现在流行的瀑布流效果, 经过我的努力终于成功的完成了 ...
- Android UI 之WaterFall瀑布流效果
所谓瀑布流效果,简单说就是宽度相同但是高度不同的一大堆图片,分成几列,然后像水流一样向下排列,并随着用户的上下滑动自动加载更多的图片内容. 语言描述比较抽象,具体效果看下面的截图: ...
- 【前端】用jQuery实现瀑布流效果
jQuery实现瀑布流效果 何为瀑布流: 瀑布流,又称瀑布流式布局.是比较流行的一种网站页面布局,视觉表现为参差不齐的多栏布局,随着页面滚动条向下滚动,这种布局还会不断加载数据块并附加至当前尾部.最早 ...
- wpf 客户端【JDAgent桌面助手】开发详解(三) 瀑布流效果实现与UI虚拟化优化大数据显示
目录区域: 业余开发的wpf 客户端终于完工了..晒晒截图 wpf 客户端[JDAgent桌面助手]开发详解-开篇 wpf 客户端[JDAgent桌面助手]详解(一)主窗口 圆形菜单... wpf 客 ...
随机推荐
- Node.js 教程
简单的说 Node.js 就是运行在服务端的 JavaScript. Node.js 是一个基于Chrome JavaScript 运行时建立的一个平台. Node.js是一个事件驱动I/O服务端Ja ...
- 安卓高级7 vitamio 视频框架 从raw文件下获取文件uri
vitamio免费的拥有多种解码器 而且容易操作 我们先来看看原生视频播放器的怎么使用 原生的: package qianfeng.com.videoviewdemo; import android. ...
- valgrind检测内存泄漏
Valgrind 使用 用法:valgrind [options] prog-and-args [options]: 常用选项,适用于所有Valgrind工具 -tool=<name>最常 ...
- Cassandra Secondary Index 介绍
摘要 本文主要介绍cassandra中的索引,物化视图,有些知识点需要对cassandra有基本的认识才能理解.比如数据在cassandra节点中如何分布.如果有不明白的地方可以看本专栏之前文章.或者 ...
- 我的第一个RootKit,支持XP、Vista、Win7、Win8 RTM 32位
只有写过一个BootKit,才能比较深刻的理解其整个过程与机制,也能加深对Windows系统引导各个过程的熟悉和理解. 我写的这个bootkit,暂时还没想到一个比较好的名字,它 1. 支持xp到w ...
- tomcat集群的failover机制
集群要提供高可用性就必须要有某种机制去保证,常用的机制为failover(故障转移),简单说就是通过一定的heartbeat检测是否有故障,一旦故障发生备份节点则接管故障节点的工作. tomcat使用 ...
- 5. React 组件的协同使用 组件嵌套和Mixin
组件是React的核心,构建大型项目时多个组件之间需要进行协同使用.可以从横向和纵向两个角度来实现组件的协同使用,纵向的协同使用就是组件嵌套,横向的协同使用就是Mixin(抽取公共方法 ...
- TortoiseSVN服务器ip地址修改后如何使用
TortoiseSVN是很多人特别是程序员经常使用的工作追述工具,在长期使用过程中难免会遇到服务器迁移ip地址变更的问题.那么在服务器ip地址变化之后,我们要如何继续使用呢?步骤其实非常简单,下面我们 ...
- Mybatis简单入门
MyBatis是一个支持普通SQL查询,存储过程和高级映射的优秀持久层框架.MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及对结果集的检索封装.MyBatis可以使用简单的XML或注解用 ...
- Android初级教程Activity小案例(计算器乘法运算)
首先设置两个布局文件,一个布局文件进行输入数据,获取加法运算:另一个布局文件进行显示最终结果.Activity1启动Activity2,并传递计算结果值给Activity2. main.xml: &l ...