RecyclerView 制作瀑布流图片
这是瀑布流的效果图

RecyclerView(ListView的升级版)
加载图片用的是第三方图片加载框架
-------------------------------------
在Xml中
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/activity_main"
android:layout_width="match_parent" android:layout_height="match_parent"> <android.support.v7.widget.RecyclerView android:id="@+id/gr_id"
android:layout_width="match_parent" android:layout_height="match_parent"/>
</RelativeLayout>
这是Activity 初始化组件
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
RecyclerView recyclerView = (RecyclerView) findViewById(R.id.gr_id);
//设置布局管理器
recyclerView.setLayoutManager(new StaggeredGridLayoutManager(3,StaggeredGridLayoutManager.VERTICAL));
//添加分隔符
recyclerView.addItemDecoration(new DividerGridItemDecoration(this));
MyAdapter adapter = new MyAdapter(this, Arrays.asList(ImageUrlArrays.IMAGE_URL_ARRAYS));
//设置Adapter
recyclerView.setAdapter(adapter);
//为子条目设置点击事件
adapter.setOnRecyclerViewItemViewListener(new RecyclerViewItemViewListener() {
@Override
public void onClickListener(RecyclerView.ViewHolder viewHolder, int position) {
Toast.makeText(MainActivity.this, "点击事件:"+position, Toast.LENGTH_SHORT).show();
}
@Override
public void onLongClickListener(RecyclerView.ViewHolder viewHolder, int position) {
Toast.makeText(MainActivity.this, "长按事件:"+position, Toast.LENGTH_SHORT).show();
}
});
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main,menu);
return super.onCreateOptionsMenu(menu);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()){
case R.id.clear_disk://清除硬盘缓存
Toast.makeText(this, "清除硬盘缓存!", Toast.LENGTH_SHORT).show();
WXHLImageLoader.getInstance().clearDiskCache();
break;
case R.id.clear_id://清除内存缓存
Toast.makeText(this, "清除内存缓存!", Toast.LENGTH_SHORT).show();
WXHLImageLoader.getInstance().clearMemoryCache();
break;
}
return super.onOptionsItemSelected(item);
}
}
需要设置数据就要newAdapter 这个Adapter是必须继承RecyclerView的Adapter 其中还要传入ViewHolder
这个ViewHolder也是要继承RecyclerView的ViewHolder
class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder>{
private Context context;
private List<String> list;
private List<Integer> heightList;
private RecyclerViewItemViewListener listener ;
public MyAdapter(Context context, List<String> list) {
this.context = context;
this.list = list;
heightList = new ArrayList<>();
for (int i = 0; i < list.size() ; i++) {
int height = (int) (Math.random()*400 + 400);
heightList.add(height);
}
}
/**
* 给itemView监听器赋值
* @param listener
*/
public void setOnRecyclerViewItemViewListener(RecyclerViewItemViewListener listener){
this.listener = listener;
}
int i = 0;
/**
* 创建ViewHolder对contentView进行复用
* @param parent
* @param viewType
* @return
*/
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
i++;
L.e("----------------onCreateViewHolder-----------i:"+i);
View contentView = LayoutInflater.from(context).inflate(R.layout.activity_main_item,parent,false);
return new ViewHolder(contentView);
}
/**
* 进行数据绑定,itemView设置数据
* @param holder
* @param position
*/
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
//改变holder.button的高度
int height = heightList.get(position);
ViewGroup.LayoutParams lp = holder.imageView.getLayoutParams();
lp.height = height;
holder.imageView.setLayoutParams(lp);
L.e("----------------onBindViewHolder-----------position:"+position);
WXHLImageLoader.getInstance().displayImage(list.get(position),holder.imageView);
holder.setPosition(position);
}
@Override
public int getItemCount() {
return list.size();
}
class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener,View.OnLongClickListener{
ImageView imageView;
private int position;
public ViewHolder(View itemView) {
super(itemView);
//为ViewHolder中的组件进行赋值
imageView = (ImageView) itemView.findViewById(R.id.id_but);
if(listener != null){//判断RecyclerViewItemViewListener是否为空,
// 若为空,不能给子条目设置点击事件,否则会出现空指针
itemView.setOnClickListener(this);
itemView.setOnLongClickListener(this);
}
}
public void setPosition(int position) {
this.position = position;
}
@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.item_id://itemView的点击事件
listener.onClickListener(this,position);
break;
}
}
@Override
public boolean onLongClick(View v) {//itemView的长按事件
listener.onLongClickListener(this,position);
return true;
}
}
}
在用RecyclerView时 是没有监听事件的 这个事件需要我们自己去写
新建一个接口
public interface RecyclerViewItemViewListener {
/**
* itemView的点击事件
* @param viewHolder
* @param position
*/
void onClickListener(RecyclerView.ViewHolder viewHolder, int position);
/**
* 是itemView的长按事件
* @param viewHolder
* @param position
*/
void onLongClickListener(RecyclerView.ViewHolder viewHolder, int position);
}
RecyclerView 制作瀑布流图片的更多相关文章
- jQuery制作瀑布流(转)
“瀑布流布局”随着pinterest网的流行而出名,现在国内使用这种风格布局的网站也越来越多,比如说Mark之,蘑菇街,点点网,哇哦等等.我第一次听到这个布局名称是来自于“乔花写的<瀑布流布局浅 ...
- Android RecyclerView(瀑布流)水平/垂直方向分割线
Android RecyclerView(瀑布流)水平/垂直方向分割线 Android RecyclerView不像过去的ListView那样随意的设置水平方向的分割线,如果要实现Recycle ...
- RecyclerView实现瀑布流效果(图文详解+源码奉送)
最近有时间研究了一下RecyclerView,果然功能强大啊,能实现的效果还是比较多的,那么今天给大家介绍一个用RecyclerView实现的瀑布流效果. 先来一张效果图: 看看怎么实现吧: 整体工程 ...
- RecyclerView实现瀑布流效果(二)
在上篇中我们知道RecyclerView中默认给我们提供了三种布局管理器,分别是LinearLayoutManager.GridLayoutManager.StaggeredGridLayoutMan ...
- [Android Pro] RecyclerView实现瀑布流效果(二)
referece to : http://blog.csdn.net/u010687392 在上篇中我们知道RecyclerView中默认给我们提供了三种布局管理器,分别是LinearLayoutMa ...
- 使用RecyclerView实现瀑布流的效果
主函数: public class MainActivity extends AppCompatActivity { private RecyclerView recyclerView; privat ...
- 初步使用RecyclerView实现瀑布流
先看效果 关于RecyclerView,真的是很强大. 个人觉得主要方便的地方是 1.直接可以设置条目布局,通过setLayoutManager LinearLayoutManager:线性布局,横向 ...
- 用RecyclerView实现瀑布流
首先建立一个 PbRecyclerViewActivity.java文件: 1 public class PbRecyclerViewActivity extends AppCompatActivit ...
- 基于RecyclerView的瀑布流实现
fragment的布局: <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" xm ...
随机推荐
- android 使用shape来优化界面效果
看下效果图: <?xml version="1.0" encoding="utf-8"?> <shape xmlns:android=&quo ...
- Coursera台大机器学习课程笔记5 -- Theory of Generalization
本章思路: 根据之前的总结,如果M很大,那么无论假设泛化能力差的概率多小,都无法忽略,所以问题转化为证明M不大,然后上章将其转化为证明成长函数:mh(N)为多项式级别.直接证明似乎很困难,本章继续利用 ...
- html5 webDatabase 存储中sql语句执行可嵌套使用
html5 webDatabase 存储中sql语句执行可嵌套使用,代码如下: *); data.transaction(function(tx){ tx.executeSql("creat ...
- 安装Mysq方法
前言: 此方法只能借鉴,如果网友安装失败,后果自负. 借鉴的书籍<跟老男孩学Linux运维 Web集群实战> 文章所使用的Mysql:https://yunpan.cn/Oc6RkgKRF ...
- C语言回顾-内存管理和指针函数
1.fgets()函数 该函数是一个文件操作相关的函数 暂时使用这个函数可以从键盘上接收一个字符串,保存到数组中 char str[50]; 1)scanf("%s",str);/ ...
- iOS的数据持久化
所谓的持久化,就是将数据保存到硬盘中,使得在应用程序或机器重启后可以继续访问之前保存的数据.在iOS开发中,有很多数据持久化的方案,接下来我将尝试着介绍一下5种方案: plist文件(属性列表) pr ...
- struts2漏洞与修复
步骤: 1.下载struts-2.3.16.3-all, D:\TEST\struts2.3.16.3 2.替换jar,参考 http://blog.csdn.net/spyjava/article/ ...
- C++11特性(模板类 initializer_list)
[1]initializer_list模板类 C++primer 原文如下: 通读原文相关篇幅,分析解读内容如下: 提供initializer_list类的初衷,为了便于将有限个同一类型(或可转换为同 ...
- Bitnami Redmine插件记录
1.bitnami安装时自带了开发环境,如ruby.rails.devkit. 为了版本兼容,应使用bitnami的命令行. 2.通过use_redmine启动命令行:运行Bitnami\redmin ...
- su- 与su的区别
su命令和su -命令最大的本质区别就是:前者只是切换了root身份,但Shell环境仍然是普通用户的Shell:而后者连用户和Shell环境一起切换成root身份了.只有切换了Shell环境才不会出 ...