[Android Pro] RecyclerView实现瀑布流效果(二)
referece to : http://blog.csdn.net/u010687392
在上篇中我们知道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://www.it165.net/uploadfile/files/2015/0705/recyclerView2.rar
转载请注明出处-http://blog.csdn.net/u010687392
[Android Pro] RecyclerView实现瀑布流效果(二)的更多相关文章
- RecyclerView实现瀑布流效果(二)
在上篇中我们知道RecyclerView中默认给我们提供了三种布局管理器,分别是LinearLayoutManager.GridLayoutManager.StaggeredGridLayoutMan ...
- RecyclerView实现瀑布流效果(图文详解+源码奉送)
最近有时间研究了一下RecyclerView,果然功能强大啊,能实现的效果还是比较多的,那么今天给大家介绍一个用RecyclerView实现的瀑布流效果. 先来一张效果图: 看看怎么实现吧: 整体工程 ...
- Android UI 之WaterFall瀑布流效果
所谓瀑布流效果,简单说就是宽度相同但是高度不同的一大堆图片,分成几列,然后像水流一样向下排列,并随着用户的上下滑动自动加载更多的图片内容. 语言描述比较抽象,具体效果看下面的截图: ...
- 实现RecyclerView下拉刷新和上拉加载更多以及RecyclerView线性、网格、瀑布流效果演示
实现RecyclerView下拉刷新和上拉加载更多以及RecyclerView线性.网格.瀑布流效果演示 效果预览 实例APP 小米应用商店 使用方法 build.gradle文件 dependenc ...
- Android RecyclerView(瀑布流)水平/垂直方向分割线
Android RecyclerView(瀑布流)水平/垂直方向分割线 Android RecyclerView不像过去的ListView那样随意的设置水平方向的分割线,如果要实现Recycle ...
- 初步使用RecyclerView实现瀑布流
先看效果 关于RecyclerView,真的是很强大. 个人觉得主要方便的地方是 1.直接可以设置条目布局,通过setLayoutManager LinearLayoutManager:线性布局,横向 ...
- RecylerView完美实现瀑布流效果
RecylerView包含三种布局管理器,分别是LinearLayoutManager,GridLayoutManager,StaggeredGridLayoutManager,对应实现单行列表,多行 ...
- 利用JS实现简单的瀑布流效果
哈哈, 我又来啦, 在这一段时间里, 我简单的学习了一下javascript(JS), 虽然不是很懂啦, 但是我也简单的尝试着做了点小东西, 就比如现在流行的瀑布流效果, 经过我的努力终于成功的完成了 ...
- 【前端】用jQuery实现瀑布流效果
jQuery实现瀑布流效果 何为瀑布流: 瀑布流,又称瀑布流式布局.是比较流行的一种网站页面布局,视觉表现为参差不齐的多栏布局,随着页面滚动条向下滚动,这种布局还会不断加载数据块并附加至当前尾部.最早 ...
随机推荐
- SQL Server中,Numric,Decimal,Money三种字段类型的区别
都是精确数据类型, 前两个可以自己定义长度和小数位数, Money的定义相当于Numric(19,4) numeric(10,2) 表示最大可以放10位数,但这10位数里有2位是小数如: 123456 ...
- 抓包利器Fiddler
1).Fiddler安装 a.下载地址: http://fiddler2.com/get-fiddler b.安装:省略(下一步...下一步即可) 2).Fiddler配置 a.允许远程计算机连接Fi ...
- 在网络7层协议中,如果想使用UDP协议达到TCP协议的效果,可以在哪层做文章?(QQ 为什么采用 UDP 协议,而不采用 TCP 协议实现?)
为了解决这题,可以具体看看下面这个讨论. 解灵运工程师 185 人赞同 某次架构师大会上那个58同城做即时通信的人说:原因是因为当时没有epoll这种可以支持成千上万tcp并发连接的技术,所以他们使用 ...
- Laravel 5.3 中文文档翻译完成
经过一个多月的紧张翻译和校对,翻译完成.以下是参与人员: Laravel 5.3 中文文档翻译完成 稿源:七星互联www . qixoo.com 文档地址在此:https://laravel-chin ...
- 初学structs2,表单验证
一.简单表单验证示例 structs.xml配置 <struts> <package name="validate" namespace="/valid ...
- 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 ...
- PHP FORUM
1.index.php <html> <!--功能:php论坛标题部分--> <head><meta http-equiv="content-typ ...
- C# 汉字转拼音
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Comm ...
- Linix常用命令
uname -a 查看内核版本 ls -al 显示所有文件的属性 pwd 显示当前路径 cd - 返回上一次目录 cd ~ ...
- 导入安全证书到jdk步骤详细说明-原
一.首先要在浏览器打开需要证书的网站,然后把证书下载下来,保存的证书名称随意命名,只要保证唯一性(这个唯一性下文有解释) 二.然后把证书复制到%JAVA_HOME%/jre/bin/路径下,即保证证书 ...