这是瀑布流的效果图

RecyclerView(ListView的升级版)

加载图片用的是第三方图片加载框架

-------------------------------------

在Xml中

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:id="@+id/activity_main"
  4. android:layout_width="match_parent" android:layout_height="match_parent">
  5.  
  6. <android.support.v7.widget.RecyclerView android:id="@+id/gr_id"
  7. android:layout_width="match_parent" android:layout_height="match_parent"/>
  8. </RelativeLayout>

这是Activity 初始化组件

  1. public class MainActivity extends AppCompatActivity {
  2.  
  3. @Override
  4. protected void onCreate(Bundle savedInstanceState) {
  5. super.onCreate(savedInstanceState);
  6. setContentView(R.layout.activity_main);
  7.  
  8. RecyclerView recyclerView = (RecyclerView) findViewById(R.id.gr_id);
  9. //设置布局管理器
  10. recyclerView.setLayoutManager(new StaggeredGridLayoutManager(3,StaggeredGridLayoutManager.VERTICAL));
  11. //添加分隔符
  12. recyclerView.addItemDecoration(new DividerGridItemDecoration(this));
  13.  
  14. MyAdapter adapter = new MyAdapter(this, Arrays.asList(ImageUrlArrays.IMAGE_URL_ARRAYS));
  15. //设置Adapter
  16. recyclerView.setAdapter(adapter);
  17.  
  18. //为子条目设置点击事件
  19. adapter.setOnRecyclerViewItemViewListener(new RecyclerViewItemViewListener() {
  20. @Override
  21. public void onClickListener(RecyclerView.ViewHolder viewHolder, int position) {
  22. Toast.makeText(MainActivity.this, "点击事件:"+position, Toast.LENGTH_SHORT).show();
  23. }
  24.  
  25. @Override
  26. public void onLongClickListener(RecyclerView.ViewHolder viewHolder, int position) {
  27. Toast.makeText(MainActivity.this, "长按事件:"+position, Toast.LENGTH_SHORT).show();
  28. }
  29. });
  30. }
  31.  
  32. @Override
  33. public boolean onCreateOptionsMenu(Menu menu) {
  34. getMenuInflater().inflate(R.menu.main,menu);
  35. return super.onCreateOptionsMenu(menu);
  36. }
  37.  
  38. @Override
  39. public boolean onOptionsItemSelected(MenuItem item) {
  40. switch (item.getItemId()){
  41. case R.id.clear_disk://清除硬盘缓存
  42. Toast.makeText(this, "清除硬盘缓存!", Toast.LENGTH_SHORT).show();
  43. WXHLImageLoader.getInstance().clearDiskCache();
  44. break;
  45. case R.id.clear_id://清除内存缓存
  46. Toast.makeText(this, "清除内存缓存!", Toast.LENGTH_SHORT).show();
  47. WXHLImageLoader.getInstance().clearMemoryCache();
  48. break;
  49. }
  50. return super.onOptionsItemSelected(item);
  51. }
  52. }

需要设置数据就要newAdapter 这个Adapter是必须继承RecyclerView的Adapter 其中还要传入ViewHolder

这个ViewHolder也是要继承RecyclerView的ViewHolder

  1. class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder>{
  2.  
  3. private Context context;
  4. private List<String> list;
  5. private List<Integer> heightList;
  6. private RecyclerViewItemViewListener listener ;
  7.  
  8. public MyAdapter(Context context, List<String> list) {
  9. this.context = context;
  10. this.list = list;
  11.  
  12. heightList = new ArrayList<>();
  13. for (int i = 0; i < list.size() ; i++) {
  14. int height = (int) (Math.random()*400 + 400);
  15. heightList.add(height);
  16. }
  17.  
  18. }
  19.  
  20. /**
  21. * 给itemView监听器赋值
  22. * @param listener
  23. */
  24. public void setOnRecyclerViewItemViewListener(RecyclerViewItemViewListener listener){
  25. this.listener = listener;
  26. }
  27.  
  28. int i = 0;
  29. /**
  30. * 创建ViewHolder对contentView进行复用
  31. * @param parent
  32. * @param viewType
  33. * @return
  34. */
  35. @Override
  36. public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
  37. i++;
  38. L.e("----------------onCreateViewHolder-----------i:"+i);
  39. View contentView = LayoutInflater.from(context).inflate(R.layout.activity_main_item,parent,false);
  40. return new ViewHolder(contentView);
  41. }
  42.  
  43. /**
  44. * 进行数据绑定,itemView设置数据
  45. * @param holder
  46. * @param position
  47. */
  48. @Override
  49. public void onBindViewHolder(ViewHolder holder, int position) {
  50.  
  51. //改变holder.button的高度
  52. int height = heightList.get(position);
  53. ViewGroup.LayoutParams lp = holder.imageView.getLayoutParams();
  54. lp.height = height;
  55. holder.imageView.setLayoutParams(lp);
  56.  
  57. L.e("----------------onBindViewHolder-----------position:"+position);
  58. WXHLImageLoader.getInstance().displayImage(list.get(position),holder.imageView);
  59. holder.setPosition(position);
  60. }
  61.  
  62. @Override
  63. public int getItemCount() {
  64. return list.size();
  65. }
  66.  
  67. class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener,View.OnLongClickListener{
  68. ImageView imageView;
  69. private int position;
  70.  
  71. public ViewHolder(View itemView) {
  72. super(itemView);
  73. //为ViewHolder中的组件进行赋值
  74. imageView = (ImageView) itemView.findViewById(R.id.id_but);
  75.  
  76. if(listener != null){//判断RecyclerViewItemViewListener是否为空,
  77. // 若为空,不能给子条目设置点击事件,否则会出现空指针
  78. itemView.setOnClickListener(this);
  79. itemView.setOnLongClickListener(this);
  80. }
  81. }
  82.  
  83. public void setPosition(int position) {
  84. this.position = position;
  85. }
  86.  
  87. @Override
  88. public void onClick(View v) {
  89. switch (v.getId()){
  90. case R.id.item_id://itemView的点击事件
  91. listener.onClickListener(this,position);
  92. break;
  93. }
  94. }
  95.  
  96. @Override
  97. public boolean onLongClick(View v) {//itemView的长按事件
  98. listener.onLongClickListener(this,position);
  99. return true;
  100. }
  101. }
  102. }

在用RecyclerView时  是没有监听事件的  这个事件需要我们自己去写

新建一个接口

  1. public interface RecyclerViewItemViewListener {
  2.  
  3. /**
  4. * itemView的点击事件
  5. * @param viewHolder
  6. * @param position
  7. */
  8. void onClickListener(RecyclerView.ViewHolder viewHolder, int position);
  9.  
  10. /**
  11. * 是itemView的长按事件
  12. * @param viewHolder
  13. * @param position
  14. */
  15. void onLongClickListener(RecyclerView.ViewHolder viewHolder, int position);
  16.  
  17. }

RecyclerView 制作瀑布流图片的更多相关文章

  1. jQuery制作瀑布流(转)

    “瀑布流布局”随着pinterest网的流行而出名,现在国内使用这种风格布局的网站也越来越多,比如说Mark之,蘑菇街,点点网,哇哦等等.我第一次听到这个布局名称是来自于“乔花写的<瀑布流布局浅 ...

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

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

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

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

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

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

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

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

  6. 使用RecyclerView实现瀑布流的效果

    主函数: public class MainActivity extends AppCompatActivity { private RecyclerView recyclerView; privat ...

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

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

  8. 用RecyclerView实现瀑布流

    首先建立一个 PbRecyclerViewActivity.java文件: 1 public class PbRecyclerViewActivity extends AppCompatActivit ...

  9. 基于RecyclerView的瀑布流实现

    fragment的布局: <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" xm ...

随机推荐

  1. python requests的安装与简单运用

    requests是python的一个HTTP客户端库,跟urllib,urllib2类似,那为什么要用requests而不用urllib2呢?官方文档中是这样说明的: python的标准库urllib ...

  2. LoadRunner连接Genymotion

  3. Hihocoder 1059 String Matching Content Length

    预处理下连续相等的字符个数其实主要是看是否满3个 后面递推的时候特判下+1上次递推[i-1,j-1]不是来自[i-2,j-1]也不是来自[i-1,j-2]其实就是只来自[i-4,j-4]+3,和[i- ...

  4. CAS学习笔记(二)—— cas server端的login-webflow详细流程

    一.配置文件介绍 关于spring的配置信息只需放入WEB-INF/spring-configuration目录即可,cas启动时会自动加载.这个目录下的spring配置文件几乎不需要改动. 在web ...

  5. 创建支持eclipse的多模块maven项目

    通过maven可以创建多个关联模块的项目(Multiple Module Projects).由一个总的模块,下面包含多个子模块(子模块还可以包含子模块). 这种maven功能能支持大型的项目构建,往 ...

  6. java在cmd下编译和执行引用jar的类

    java编译和执行引用第三方jarcmd  1.将上面的ojdbc14.jar文件,与调用程序复制到系统D盘的根目录下,切记:因为调用程序在wym.database包下,所以需要将类其所在的包一起拷贝 ...

  7. 日常开发使用GIT命令

    git是一种分布式的版本管理工具,现在我总结下日常使用的git命令 1)检出 git clone 地址 --检出代码 #这里的地址是代码池的地址,如Github或bitbucket 2)增加文件 gi ...

  8. 【原创】我所理解的自动更新-APP发布与后台发布

    发布后台 创建渠道:添加新的渠道,设置渠道名称,自动生成渠道id.    查看渠道:查看渠道基本信息,渠道app版本号,资源版本号,是否开启更新.    创建/更新APP:选择打包ios,androi ...

  9. “error LNK2019: 无法解析的外部符号”之分析

    最近在用VS 2008开发,初学遇到不少问题,最头疼的问题之一就是:LNK2019. 百度一下讲的并不够全面,反正都没解决我的问题. error LNK2019问题在VC 6.0中是error LNK ...

  10. openlayers 3监听地图分辨率变化事件

    map.getView().on('change:resolution',checkZoom);//checkZoom为调用的函数 function checkZoom() { // alert(&q ...