# waterfall
**Repository Path**: Cookizz/waterfall
## Basic Information
- **Project Name**: waterfall
- **Description**: Android瀑布流布局框架
- **Primary Language**: Android
- **License**: Apache-2.0
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 5
- **Forks**: 2
- **Created**: 2015-03-11
- **Last Updated**: 2020-12-19
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# waterfall
**1. 简介**
瀑布流(waterfall)是一种元素定宽不定高、横向看去参差不齐的多列布局。随着页面向下滚动,这种布局会不断加载数据块并附加至当前的尾部。它提供错落有致、琳琅满目的视觉效果,特别适用于展现多彩纷呈的图片集。
**2. 为Android应用搭建瀑布流布局**
在Android中应用这种布局不是一件很轻松的事,不过这个waterfall框架已经把大部分工作帮你做好了,你只需学会如何使用它。
2.1 引用瀑布流组件
在你的项目里引用waterfall工程库,并在你需要的布局位置添加瀑布流组件(瀑布流默认为2列,具体怎么设置请参看[注意事项](#attentions))。
```xml
```
```java
Waterfall mWaterfall = (Waterfall) findViewById(R.id.waterfall);
```
2.2 实现你的Adapter
推荐你在Adapter中使用一款开源框架:Universal-Image-Loader。它封装了令人头疼的图片加载功能,并提供options满足开发者大部分需求,譬如:使用缓存、使用本地缓存、设置位图格式等。
2.3 添加监听器
给瀑布流添加懒加载监听,规定当页面滑至最底部时要做些什么(通常是加载一批新数据附加至当前的尾部)、当新数据附加完毕时要做些什么。
```java
mWaterfall.addLazyLoadListener(new LazyLoadListener() {
@Override
public void onLazyLoadReady() {
// TODO your code here
}
@Override
public void onLazyLoadFinish() {
// TODO your code here
}
});
```
3. 注意事项
3.1 元素的排列顺序
在任意时刻,当你向waterfall中添加一个元素的时候,waterfall总是会把这个元素附加到当前所有列中最短的那一列之后,其意图很明显:尽最大努力使各列元素总高度保持近似一致。
3.2 自定义属性
waterfall允许你在xml中自定义2类属性:列数(`column_count`)、元素间距(`item_margin`)。
```xml
```
3.3 header & footer
你可以根据需要实现瀑布流的header和footer。
```java
View footer = getLayoutInflater().inflate(R.layout.waterfall_item_footer, null);
mWaterfall.addFooterView(footer);
```
通常,你的footer会有2种状态:如果你的懒加载需要等待一定的时间,你的footer会处于“正在加载”状态;当加载完毕后,这个footer会切换为隐藏状态(直到下一次懒加载准备就绪)。
如何实现这种带状态的footer呢?除了通过实现上述LazyLoadListener的监听器方法之外,waterfall提供了一种更简单的方法:给你的footer实现ILazyLoadFooter接口,规定footer如何表示特定的2种状态,因为waterfall已经为你做好了触发的时机,所以你只需给你的footer实现这个接口就可以了。
```java
public interface ILazyLoadFooter {
/**
* show footer when a lazy-load is ready
*/
public void show();
/**
* hide footer when the lazy-load is finished
*/
public void hide();
}
```