referece to : http://blog.csdn.net/u010687392

在上篇中我们知道RecyclerView中默认给我们提供了三种布局管理器,分别是LinearLayoutManager、 GridLayoutManager、StaggeredGridLayoutManager。其中 StaggeredGridLayoutManager可实现交错式网格布局,正好可以用来实现瀑布流。

下面先看看效果图吧,再贴代码:

其中大部分内容实现其实是和上篇文章是一样的,就不多叙述了,就一个地方不同,就是我们在适配器中绑定ViewHolder的方法中需要重新给我们的itemView布局设置height,我这里是生成随机数来设置高度的,代码实现为:

  1. private void getRandomHeight(List<String> lists){//得到随机item的高度
  2. heights = new ArrayList<>();
  3. for (int i = 0; i < lists.size(); i++) {
  4. heights.add((int)(200+Math.random()*400));
  5. }
  6. }

在onBindViewHolder方法中:

  1. ViewGroup.LayoutParams params = holder.itemView.getLayoutParams();//得到item的LayoutParams布局参数
  2. params.height = heights.get(position);//把随机的高度赋予itemView布局
  3. holder.itemView.setLayoutParams(params);//把params设置给itemView布局

从而实现瀑布流效果。

贴一下代码吧:

MainActivity.java

  1. public class MainActivity extends AppCompatActivity {
  2. private RecyclerView mRecyclerView;
  3. private List<String> lists;
  4. private MyRecyclerAdapter adapter;
  5.  
  6. @Override
  7. protected void onCreate(Bundle savedInstanceState) {
  8. super.onCreate(savedInstanceState);
  9. setContentView(R.layout.activity_main);
  10. initData();
  11. mRecyclerView = (RecyclerView) this.findViewById(R.id.recyclerView);
  12. mRecyclerView.setItemAnimator(new DefaultItemAnimator());
  13. // mRecyclerView.addItemDecoration();//设置分割线
  14. mRecyclerView.setLayoutManager(new StaggeredGridLayoutManager(2, StaggeredGridLayoutManager.VERTICAL));//设置RecyclerView布局管理器为2列垂直排布
  15. adapter = new MyRecyclerAdapter(this,lists);
  16. mRecyclerView.setAdapter(adapter);
  17. adapter.setOnClickListener(new MyRecyclerAdapter.OnItemClickListener() {
  18. @Override
  19. public void ItemClickListener(View view, int postion) {
  20. Toast.makeText(MainActivity.this,"点击了:"+postion,Toast.LENGTH_SHORT).show();
  21. }
  22. @Override
  23. public void ItemLongClickListener(View view, int postion) {
  24. //长按删除
  25. lists.remove(postion);
  26. adapter.notifyItemRemoved(postion);
  27. }
  28. });
  29. }
  30.  
  31. private void initData() {
  32. lists = new ArrayList();
  33. for (int i = 0; i < 100; i++) {
  34. lists.add("" + i);
  35. }
  36. }
  37.  
  38. }

MyRecyclerAdapter.java

  1. public class MyRecyclerAdapter extends RecyclerView.Adapter<MyViewHolder> {
  2. private List<String> lists;
  3. private Context context;
  4. private List<Integer> heights;
  5. private OnItemClickListener mListener;
  6. public MyRecyclerAdapter(Context context,List<String> lists) {
  7. this.context = context;
  8. this.lists = lists;
  9. getRandomHeight(this.lists);
  10. }
  11. private void getRandomHeight(List<String> lists){//得到随机item的高度
  12. heights = new ArrayList<>();
  13. for (int i = 0; i < lists.size(); i++) {
  14. heights.add((int)(200+Math.random()*400));
  15. }
  16. }
  17. public interface OnItemClickListener{
  18. void ItemClickListener(View view,int postion);
  19. void ItemLongClickListener(View view,int postion);
  20. }
  21. public void setOnClickListener(OnItemClickListener listener){
  22. this.mListener = listener;
  23. }
  24. @Override
  25. public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
  26. View view = LayoutInflater.from(context).inflate(R.layout.item,parent,false);
  27. MyViewHolder viewHolder = new MyViewHolder(view);
  28. return viewHolder;
  29. }
  30.  
  31. @Override
  32. public void onBindViewHolder(final MyViewHolder holder, int position) {
  33. ViewGroup.LayoutParams params = holder.itemView.getLayoutParams();//得到item的LayoutParams布局参数
  34. params.height = heights.get(position);//把随机的高度赋予item布局
  35. holder.itemView.setLayoutParams(params);//把params设置给item布局
  36.  
  37. holder.mTv.setText(lists.get(position));//为控件绑定数据
  38. if(mListener!=null){//如果设置了监听那么它就不为空,然后回调相应的方法
  39. holder.itemView.setOnClickListener(new View.OnClickListener() {
  40. @Override
  41. public void onClick(View v) {
  42. int pos = holder.getLayoutPosition();//得到当前点击item的位置pos
  43. mListener.ItemClickListener(holder.itemView,pos);//把事件交给我们实现的接口那里处理
  44. }
  45. });
  46. holder.itemView.setOnLongClickListener(new View.OnLongClickListener() {
  47. @Override
  48. public boolean onLongClick(View v) {
  49. int pos = holder.getLayoutPosition();//得到当前点击item的位置pos
  50. mListener.ItemLongClickListener(holder.itemView,pos);//把事件交给我们实现的接口那里处理
  51. return true;
  52. }
  53. });
  54. }
  55. }
  56.  
  57. @Override
  58. public int getItemCount() {
  59. return lists.size();
  60. }
  61. }
  62. class MyViewHolder extends RecyclerView.ViewHolder{
  63. TextView mTv;
  64. public MyViewHolder(View itemView) {
  65. super(itemView);
  66. mTv = (TextView) itemView.findViewById(R.id.textView);
  67. }
  68. }

源码下载地址:http://www.it165.net/uploadfile/files/2015/0705/recyclerView2.rar

转载请注明出处-http://blog.csdn.net/u010687392

[Android Pro] RecyclerView实现瀑布流效果(二)的更多相关文章

  1. RecyclerView实现瀑布流效果(二)

    在上篇中我们知道RecyclerView中默认给我们提供了三种布局管理器,分别是LinearLayoutManager.GridLayoutManager.StaggeredGridLayoutMan ...

  2. RecyclerView实现瀑布流效果(图文详解+源码奉送)

    最近有时间研究了一下RecyclerView,果然功能强大啊,能实现的效果还是比较多的,那么今天给大家介绍一个用RecyclerView实现的瀑布流效果. 先来一张效果图: 看看怎么实现吧: 整体工程 ...

  3. Android UI 之WaterFall瀑布流效果

        所谓瀑布流效果,简单说就是宽度相同但是高度不同的一大堆图片,分成几列,然后像水流一样向下排列,并随着用户的上下滑动自动加载更多的图片内容.     语言描述比较抽象,具体效果看下面的截图:   ...

  4. 实现RecyclerView下拉刷新和上拉加载更多以及RecyclerView线性、网格、瀑布流效果演示

    实现RecyclerView下拉刷新和上拉加载更多以及RecyclerView线性.网格.瀑布流效果演示 效果预览 实例APP 小米应用商店 使用方法 build.gradle文件 dependenc ...

  5. Android RecyclerView(瀑布流)水平/垂直方向分割线

     Android RecyclerView(瀑布流)水平/垂直方向分割线 Android RecyclerView不像过去的ListView那样随意的设置水平方向的分割线,如果要实现Recycle ...

  6. 初步使用RecyclerView实现瀑布流

    先看效果 关于RecyclerView,真的是很强大. 个人觉得主要方便的地方是 1.直接可以设置条目布局,通过setLayoutManager LinearLayoutManager:线性布局,横向 ...

  7. RecylerView完美实现瀑布流效果

    RecylerView包含三种布局管理器,分别是LinearLayoutManager,GridLayoutManager,StaggeredGridLayoutManager,对应实现单行列表,多行 ...

  8. 利用JS实现简单的瀑布流效果

    哈哈, 我又来啦, 在这一段时间里, 我简单的学习了一下javascript(JS), 虽然不是很懂啦, 但是我也简单的尝试着做了点小东西, 就比如现在流行的瀑布流效果, 经过我的努力终于成功的完成了 ...

  9. 【前端】用jQuery实现瀑布流效果

    jQuery实现瀑布流效果 何为瀑布流: 瀑布流,又称瀑布流式布局.是比较流行的一种网站页面布局,视觉表现为参差不齐的多栏布局,随着页面滚动条向下滚动,这种布局还会不断加载数据块并附加至当前尾部.最早 ...

随机推荐

  1. SQL Server中,Numric,Decimal,Money三种字段类型的区别

    都是精确数据类型, 前两个可以自己定义长度和小数位数, Money的定义相当于Numric(19,4) numeric(10,2) 表示最大可以放10位数,但这10位数里有2位是小数如: 123456 ...

  2. 抓包利器Fiddler

    1).Fiddler安装 a.下载地址: http://fiddler2.com/get-fiddler b.安装:省略(下一步...下一步即可) 2).Fiddler配置 a.允许远程计算机连接Fi ...

  3. 在网络7层协议中,如果想使用UDP协议达到TCP协议的效果,可以在哪层做文章?(QQ 为什么采用 UDP 协议,而不采用 TCP 协议实现?)

    为了解决这题,可以具体看看下面这个讨论. 解灵运工程师 185 人赞同 某次架构师大会上那个58同城做即时通信的人说:原因是因为当时没有epoll这种可以支持成千上万tcp并发连接的技术,所以他们使用 ...

  4. Laravel 5.3 中文文档翻译完成

    经过一个多月的紧张翻译和校对,翻译完成.以下是参与人员: Laravel 5.3 中文文档翻译完成 稿源:七星互联www . qixoo.com 文档地址在此:https://laravel-chin ...

  5. 初学structs2,表单验证

    一.简单表单验证示例 structs.xml配置 <struts> <package name="validate" namespace="/valid ...

  6. MyBatis查询传一个参数时报错:There is no getter for property named 'sleevetype' in 'class java.lang.Integer

    用MyBatis进行查询,传入参数只有一个时(非Map)如int,报错 There is no getter for property named 'sleevetype' in 'class jav ...

  7. PHP FORUM

    1.index.php <html> <!--功能:php论坛标题部分--> <head><meta http-equiv="content-typ ...

  8. C# 汉字转拼音

    using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Comm ...

  9. Linix常用命令

    uname -a    查看内核版本        ls -al    显示所有文件的属性 pwd         显示当前路径         cd -    返回上一次目录     cd ~    ...

  10. 导入安全证书到jdk步骤详细说明-原

    一.首先要在浏览器打开需要证书的网站,然后把证书下载下来,保存的证书名称随意命名,只要保证唯一性(这个唯一性下文有解释) 二.然后把证书复制到%JAVA_HOME%/jre/bin/路径下,即保证证书 ...