在上篇中我们知道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://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等数据,即:

  1. int firstIndex = mLayoutManager.findFirstVisibleItemPosition();//返回当前屏幕第一个显示的item的postion
  2. int firstComIndex = mLayoutManager.findFirstCompletelyVisibleItemPosition();//返回当前屏幕第一个完全显示的item的postion
  3. int lastIndex = mLayoutManager.findLastVisibleItemPosition();//返回当前屏幕最后一个显示的item的position
  4. int lastComIndex = mLayoutManager.findLastCompletelyVisibleItemPosition();//返回当前屏幕最后一个完全显示的item的posion
  5. View view = mLayoutManager.findViewByPosition(int postion);//返回对应postion的itemView

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

  1. [Android Pro] RecyclerView实现瀑布流效果(二)

    referece to : http://blog.csdn.net/u010687392 在上篇中我们知道RecyclerView中默认给我们提供了三种布局管理器,分别是LinearLayoutMa ...

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

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

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

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

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

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

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

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

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

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

  7. Android UI 之WaterFall瀑布流效果

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

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

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

  9. wpf 客户端【JDAgent桌面助手】开发详解(三) 瀑布流效果实现与UI虚拟化优化大数据显示

    目录区域: 业余开发的wpf 客户端终于完工了..晒晒截图 wpf 客户端[JDAgent桌面助手]开发详解-开篇 wpf 客户端[JDAgent桌面助手]详解(一)主窗口 圆形菜单... wpf 客 ...

随机推荐

  1. 自定义支持多行显示的RadioGroup

    自定义支持多行显示的RadioGroup 原生的RadioGroup继承自LinearLayout,即只能支持一横排或者一竖排的排列显示RadioButton 现在改写RadioGroup,使它支持多 ...

  2. HDFS基本原理及数据存取实战

    ---------------------------------------------------------------------------------------------------- ...

  3. Spark核心类:SQLContext和DataFrame

    http://blog.csdn.net/pipisorry/article/details/53320669 pyspark.sql.SQLContext Main entry point for ...

  4. Android Multimedia框架总结(十九)Camera2框架C/S模型之CameraService启动及与Client连接过程

    转载请把头部出处链接和尾部二维码一起转载,本文出自逆流的鱼yuiop:http://blog.csdn.net/hejjunlin/article/details/53150322 Agenda: 一 ...

  5. Swift如何取得View所属的ViewController

    从VC取得View很容易,但有些情况下我们需要从View反向获取VC. 不过在一些特殊的场合,Cocoa库帮我们想的很周到,比如在自定义View过渡动画的时候: func animateTransit ...

  6. 剑指Offer——求职必备神器

    剑指Offer--求职必备神器 前言   不管是公司网申.银行招聘.面试等等,"谈谈你的职业规划"."以往工作中遇到了哪些棘手问题?你是如何解决的?".&quo ...

  7. [struts2学习笔记] 第三节 创建struts 2 HelloWorld所需的六个步骤

    本文地址:http://blog.csdn.net/sushengmiyan/article/details/40349201 官方文档:http://struts.apache.org/releas ...

  8. 插件开发之360 DroidPlugin源码分析(五)Service预注册占坑

    请尊重分享成果,转载请注明出处: http://blog.csdn.net/hejjunlin/article/details/52264977 在了解系统的activity,service,broa ...

  9. 混合开发(一)——WebView开发高级技巧之加载网页以及JavaScript,加载进度条

    混合开发(一)--WebView开发高级技巧之加载网页以及JavaScript,加载进度条 现在关于混合开发也越来越多了,很多人喜欢跟随,比如HB,比如RN,其实这东西很早就有这么一个概念了,而且说实 ...

  10. ScheduledExecutorService和timer的异同

    先来个传统的Timer的例子: package com.jerry.concurrency; import java.text.ParseException; import java.text.Sim ...