博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
RecyclerView 制作瀑布流图片
阅读量:4647 次
发布时间:2019-06-09

本文共 6261 字,大约阅读时间需要 20 分钟。

这是瀑布流的效果图

RecyclerView(ListView的升级版)

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

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

在Xml中

1 
2
5 6
8

 

这是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         //设置Adapter16         recyclerView.setAdapter(adapter);17 18         //为子条目设置点击事件19         adapter.setOnRecyclerViewItemViewListener(new RecyclerViewItemViewListener() {20             @Override21             public void onClickListener(RecyclerView.ViewHolder viewHolder, int position) {22                 Toast.makeText(MainActivity.this, "点击事件:"+position, Toast.LENGTH_SHORT).show();23             }24 25             @Override26             public void onLongClickListener(RecyclerView.ViewHolder viewHolder, int position) {27                 Toast.makeText(MainActivity.this, "长按事件:"+position, Toast.LENGTH_SHORT).show();28             }29         });30     }31 32     @Override33     public boolean onCreateOptionsMenu(Menu menu) {34         getMenuInflater().inflate(R.menu.main,menu);35         return super.onCreateOptionsMenu(menu);36     }37 38     @Override39     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
{ 2 3 private Context context; 4 private List
list; 5 private List
heightList; 6 private RecyclerViewItemViewListener listener ; 7 8 public MyAdapter(Context context, List
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 68 class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener,View.OnLongClickListener{ 69 ImageView imageView; 70 private int position; 71 72 public ViewHolder(View itemView) { 73 super(itemView); 74 //为ViewHolder中的组件进行赋值 75 imageView = (ImageView) itemView.findViewById(R.id.id_but); 76 77 if(listener != null){
//判断RecyclerViewItemViewListener是否为空, 78 // 若为空,不能给子条目设置点击事件,否则会出现空指针 79 itemView.setOnClickListener(this); 80 itemView.setOnLongClickListener(this); 81 } 82 } 83 84 public void setPosition(int position) { 85 this.position = position; 86 } 87 88 @Override 89 public void onClick(View v) { 90 switch (v.getId()){ 91 case R.id.item_id://itemView的点击事件 92 listener.onClickListener(this,position); 93 break; 94 } 95 } 96 97 @Override 98 public boolean onLongClick(View v) {
//itemView的长按事件 99 listener.onLongClickListener(this,position);100 return true;101 }102 }103 }

在用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 viewHolder13      * @param position14      */15     void onLongClickListener(RecyclerView.ViewHolder viewHolder, int position);16 17 }

 

转载于:https://www.cnblogs.com/zqyj-y/p/5943664.html

你可能感兴趣的文章
团队冲刺04
查看>>
我的Python分析成长之路8
查看>>
泛型在三层中的应用
查看>>
SharePoint2010 -- 管理配置文件同步
查看>>
.Net MVC3中取得当前区域的名字(Area name)
查看>>
获得屏幕像素以及像素密度
查看>>
int与string转换
查看>>
adb命令 判断锁屏
查看>>
推荐一个MacOS苹果电脑系统解压缩软件
查看>>
1035等差数列末项计算
查看>>
CDMA鉴权
查看>>
ASP.NET MVC Identity 兩個多個連接字符串問題解決一例
查看>>
过滤器与拦截器区别
查看>>
USACO 1.5.4 Checker Challenge
查看>>
第二阶段站立会议7
查看>>
[18]Debian Linux Install GNU GCC Compiler and Development Environment
查看>>
JAVA多线程
查看>>
ACE(Adaptive Communication Environment)介绍
查看>>
delphi 更改DBGrid 颜色技巧
查看>>
python编码问题
查看>>