├── .gitignore ├── README.md ├── README_ch.md ├── build.gradle ├── demo ├── .gitignore ├── build.gradle ├── proguard-rules.pro └── src │ ├── androidTest │ └── java │ │ └── com │ │ └── jude │ │ └── dome │ │ └── ApplicationTest.java │ └── main │ ├── AndroidManifest.xml │ ├── java │ └── com │ │ └── jude │ │ └── dome │ │ ├── DataProvider.java │ │ ├── MainActivity.java │ │ ├── Utils.java │ │ ├── collapsing │ │ └── CollapsingActivity.java │ │ ├── entites │ │ ├── Ad.java │ │ ├── Person.java │ │ └── Picture.java │ │ ├── header │ │ ├── BannerAdapter.java │ │ └── HeaderFooterActivity.java │ │ ├── horizontal │ │ ├── HorizontalActivity.java │ │ └── NarrowImageAdapter.java │ │ ├── insert │ │ └── InsertActivity.java │ │ ├── loadmore │ │ ├── PersonAdapter.java │ │ └── RefreshAndMoreActivity.java │ │ ├── multistyle │ │ ├── MultiStyleActivity.java │ │ └── PersonWithAdAdapter.java │ │ ├── staggeredgrid │ │ ├── ImageAdapter.java │ │ └── StaggeredGridActivity.java │ │ ├── sticky │ │ ├── StickyHeaderActivity.java │ │ └── StickyHeaderAdapter.java │ │ └── viewholder │ │ ├── AdViewHolder.java │ │ ├── ImageViewHolder.java │ │ └── PersonViewHolder.java │ └── res │ ├── drawable-xxhdpi │ ├── default_image.png │ ├── header.jpg │ ├── ic_add.png │ ├── ic_refresh.png │ ├── ic_remove.png │ ├── ic_top.png │ ├── star.png │ ├── yy01.jpg │ ├── yy02.jpg │ ├── yy03.jpg │ ├── yy04.jpg │ ├── yy05.jpg │ ├── yy06.jpg │ ├── yy07.jpg │ ├── yy08.jpg │ └── yy09.jpg │ ├── layout │ ├── activity_collapsing.xml │ ├── activity_horizontal.xml │ ├── activity_loadmore.xml │ ├── activity_main.xml │ ├── activity_recyclerview.xml │ ├── header_item.xml │ ├── item_person.xml │ ├── view_empty.xml │ ├── view_error.xml │ ├── view_more.xml │ ├── view_more_horizontal.xml │ ├── view_nomore.xml │ └── view_progress.xml │ ├── menu │ ├── menu_insert.xml │ └── menu_main.xml │ ├── mipmap-hdpi │ └── ic_launcher.png │ ├── mipmap-mdpi │ └── ic_launcher.png │ ├── mipmap-xhdpi │ └── ic_launcher.png │ ├── mipmap-xxhdpi │ └── ic_launcher.png │ ├── values-w820dp │ └── dimens.xml │ └── values │ ├── dimens.xml │ ├── strings.xml │ └── styles.xml ├── easyrecyclerview ├── .gitignore ├── build.gradle ├── proguard-rules.pro └── src │ └── main │ ├── AndroidManifest.xml │ ├── java │ └── com │ │ └── jude │ │ └── easyrecyclerview │ │ ├── EasyDataObserver.java │ │ ├── EasyRecyclerView.java │ │ ├── adapter │ │ ├── BaseViewHolder.java │ │ ├── DefaultEventDelegate.java │ │ ├── EventDelegate.java │ │ ├── FixDataObserver.java │ │ └── RecyclerArrayAdapter.java │ │ ├── decoration │ │ ├── DividerDecoration.java │ │ ├── SpaceDecoration.java │ │ └── StickyHeaderDecoration.java │ │ └── swipe │ │ ├── CircleImageView.java │ │ ├── MaterialProgressDrawable.java │ │ └── SwipeRefreshLayout.java │ └── res │ ├── layout │ └── layout_progress_recyclerview.xml │ └── values │ └── attrs.xml ├── gradle.properties ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── recycler3.gif └── settings.gradle /.gitignore: -------------------------------------------------------------------------------- 1 | 2 | .gradle 3 | .DS_Store 4 | /captures 5 | 6 | # built application files 7 | *.apk 8 | 9 | # files for the dex VM 10 | *.dex 11 | 12 | # Java class files 13 | *.class 14 | 15 | # generated files 16 | bin/ 17 | gen/ 18 | build 19 | 20 | # Local configuration file (sdk path, etc) 21 | local.properties 22 | 23 | # Eclipse project files 24 | .classpath 25 | .project 26 | 27 | # Proguard folder generated by Eclipse 28 | proguard/ 29 | 30 | # Intellij project files 31 | *.iml 32 | *.ipr 33 | *.iws 34 | .idea 35 | 36 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # EasyRecyclerView 2 | [中文](https://github.com/Jude95/EasyRecyclerView/blob/master/README_ch.md) | [English](https://github.com/Jude95/EasyRecyclerView/blob/master/README.md) 3 | 4 | Encapsulate many API about RecyclerView into the library,such as arrayAdapter,pull to refresh,auto load more,no more and error in the end,header&footer. 5 | The library uses a new usage of ViewHolder,decoupling the ViewHolder and Adapter. 6 | Adapter will do less work,adapter only direct the ViewHolder,if you use MVP,you can put adapter into presenter.ViewHolder only show the item,then you can use one ViewHolder for many Adapter. 7 | Part of the code modified from [Malinskiy/SuperRecyclerView](https://github.com/Malinskiy/SuperRecyclerView),make more functions handed by Adapter. 8 | 9 | 10 | # Dependency 11 | ```groovy 12 | compile 'com.jude:easyrecyclerview:4.4.2' 13 | ``` 14 | 15 | # ScreenShot 16 | ![recycler.gif](recycler3.gif) 17 | # Usage 18 | ## EasyRecyclerView 19 | ```xml 20 | 36 | ``` 37 | 38 | **Attention** EasyRecyclerView is not a RecyclerView just contain a RecyclerView.use 'getRecyclerView()' to get the RecyclerView; 39 | 40 | **EmptyView&LoadingView&ErrorView** 41 | xml: 42 | ```xml 43 | app:layout_empty="@layout/view_empty" 44 | app:layout_progress="@layout/view_progress" 45 | app:layout_error="@layout/view_error" 46 | ``` 47 | 48 | code: 49 | ```java 50 | void setEmptyView(View emptyView) 51 | void setProgressView(View progressView) 52 | void setErrorView(View errorView) 53 | ``` 54 | 55 | then you can show it by this whenever: 56 | 57 | ```java 58 | void showEmpty() 59 | void showProgress() 60 | void showError() 61 | void showRecycler() 62 | ``` 63 | 64 | **scrollToPosition** 65 | ```java 66 | void scrollToPosition(int position); // such as scroll to top 67 | ``` 68 | 69 | **control the pullToRefresh** 70 | ```java 71 | void setRefreshing(boolean isRefreshing); 72 | void setRefreshing(final boolean isRefreshing, final boolean isCallback); //second params is callback immediately 73 | ``` 74 | 75 | 76 | ##RecyclerArrayAdapter 77 | there is no relation between RecyclerArrayAdapter and EasyRecyclerView.you can user any Adapter for the EasyRecyclerView,and use the RecyclerArrayAdapter for any RecyclerView. 78 | 79 | **Data Manage** 80 | ```java 81 | void add(T object); 82 | void addAll(Collection collection); 83 | void addAll(T ... items); 84 | void insert(T object, int index); 85 | void update(T object, int index); 86 | void remove(T object); 87 | void clear(); 88 | void sort(Comparator comparator); 89 | ``` 90 | 91 | **Header&Footer** 92 | ```java 93 | void addHeader(ItemView view) 94 | void addFooter(ItemView view) 95 | ``` 96 | 97 | ItemView is not a view but a view creator; 98 | 99 | ```java 100 | public interface ItemView { 101 | View onCreateView(ViewGroup parent); 102 | void onBindView(View itemView); 103 | } 104 | ``` 105 | 106 | The onCreateView and onBindView correspond the callback in RecyclerView's Adapter,so adapter will call `onCreateView` once and `onBindView` more than once; 107 | It recommend that add the ItemView to Adapter after the data is loaded,initialization View in onCreateView and nothing in onBindView. 108 | 109 | Header and Footer support `LinearLayoutManager`,`GridLayoutManager`,`StaggeredGridLayoutManager`. 110 | In `GridLayoutManager` you must add this: 111 | ```java 112 | //make adapter obtain a LookUp for LayoutManager,param is maxSpan。 113 | gridLayoutManager.setSpanSizeLookup(adapter.obtainGridSpanSizeLookUp(2)); 114 | ``` 115 | 116 | **OnItemClickListener&OnItemLongClickListener** 117 | ```java 118 | adapter.setOnItemClickListener(new RecyclerArrayAdapter.OnItemClickListener() { 119 | @Override 120 | public void onItemClick(int position) { 121 | //position not contain Header 122 | } 123 | }); 124 | 125 | adapter.setOnItemLongClickListener(new RecyclerArrayAdapter.OnItemLongClickListener() { 126 | @Override 127 | public boolean onItemLongClick(int position) { 128 | return true; 129 | } 130 | }); 131 | ``` 132 | equal 'itemview.setOnClickListener()' in ViewHolder. 133 | if you set listener after RecyclerView has layout.you should use 'notifyDataSetChange()'; 134 | 135 | ###the API below realized by add a Footer。 136 | 137 | **LoadMore** 138 | ```java 139 | void setMore(final int res,OnMoreListener listener); 140 | void setMore(final View view,OnMoreListener listener); 141 | ``` 142 | Attention when you add null or the length of data you add is 0 ,it will finish LoadMore and show NoMore; 143 | also you can show NoMore manually `adapter.stopMore();` 144 | 145 | **LoadError** 146 | ```java 147 | void setError(final int res,OnErrorListener listener) 148 | void setError(final View view,OnErrorListener listener) 149 | ``` 150 | use `adapter.pauseMore()` to show Error,when your loading throw an error; 151 | if you add data when showing Error.it will resume to load more; 152 | when the ErrorView display to screen again,it will resume to load more too,and callback the OnLoadMoreListener(retry). 153 | `adapter.resumeMore()`you can resume to load more manually,it will callback the OnLoadMoreListener immediately. 154 | you can put resumeMore() into the OnClickListener of ErrorView to realize click to retry. 155 | 156 | **NoMore** 157 | ```java 158 | void setNoMore(final int res,OnNoMoreListener listener) 159 | void setNoMore(final View view,OnNoMoreListener listener) 160 | ``` 161 | when loading is finished(add null or empty or stop manually),it while show in the end. 162 | 163 | ## BaseViewHolder\ 164 | decoupling the ViewHolder and Adapter,new ViewHolder in Adapter and inflate view in ViewHolder. 165 | Example: 166 | 167 | ```java 168 | public class PersonViewHolder extends BaseViewHolder { 169 | private TextView mTv_name; 170 | private SimpleDraweeView mImg_face; 171 | private TextView mTv_sign; 172 | 173 | 174 | public PersonViewHolder(ViewGroup parent) { 175 | super(parent,R.layout.item_person); 176 | mTv_name = $(R.id.person_name); 177 | mTv_sign = $(R.id.person_sign); 178 | mImg_face = $(R.id.person_face); 179 | } 180 | 181 | @Override 182 | public void setData(final Person person){ 183 | mTv_name.setText(person.getName()); 184 | mTv_sign.setText(person.getSign()); 185 | mImg_face.setImageURI(Uri.parse(person.getFace())); 186 | } 187 | } 188 | 189 | ----------------------------------------------------------------------- 190 | 191 | public class PersonAdapter extends RecyclerArrayAdapter { 192 | public PersonAdapter(Context context) { 193 | super(context); 194 | } 195 | 196 | @Override 197 | public BaseViewHolder OnCreateViewHolder(ViewGroup parent, int viewType) { 198 | return new PersonViewHolder(parent); 199 | } 200 | } 201 | ``` 202 | 203 | ## Decoration 204 | Now there are three commonly used decoration provide for you. 205 | **DividerDecoration** 206 | Usually used in LinearLayoutManager.add divider between items. 207 | ```java 208 | DividerDecoration itemDecoration = new DividerDecoration(Color.GRAY, Util.dip2px(this,0.5f), Util.dip2px(this,72),0);//color & height & paddingLeft & paddingRight 209 | itemDecoration.setDrawLastItem(true);//sometimes you don't want draw the divider for the last item,default is true. 210 | itemDecoration.setDrawHeaderFooter(false);//whether draw divider for header and footer,default is false. 211 | recyclerView.addItemDecoration(itemDecoration); 212 | ``` 213 | this is the demo: 214 | 215 | 216 | 217 | **SpaceDecoration** 218 | Usually used in GridLayoutManager and StaggeredGridLayoutManager.add space between items. 219 | ```java 220 | SpaceDecoration itemDecoration = new SpaceDecoration((int) Utils.convertDpToPixel(8,this));//params is height 221 | itemDecoration.setPaddingEdgeSide(true);//whether add space for left and right adge.default is true. 222 | itemDecoration.setPaddingStart(true);//whether add top space for the first line item(exclude header).default is true. 223 | itemDecoration.setPaddingHeaderFooter(false);//whether add space for header and footer.default is false. 224 | recyclerView.addItemDecoration(itemDecoration); 225 | ``` 226 | this is the demo: 227 | 228 | 229 | **StickHeaderDecoration** 230 | Group the items,add a GroupHeaderView for each group.The usage of StickyHeaderAdapter is the same with RecyclerView.Adapter. 231 | this part is modified from [edubarr/header-decor](https://github.com/edubarr/header-decor) 232 | ```java 233 | StickyHeaderDecoration decoration = new StickyHeaderDecoration(new StickyHeaderAdapter(this)); 234 | decoration.setIncludeHeader(false); 235 | recyclerView.addItemDecoration(decoration); 236 | ``` 237 | for example: 238 | 239 | 240 | **for detail,see the demo** 241 | 242 | License 243 | ------- 244 | 245 | Copyright 2015 Jude 246 | 247 | Licensed under the Apache License, Version 2.0 (the "License"); 248 | you may not use this file except in compliance with the License. 249 | You may obtain a copy of the License at 250 | 251 | http://www.apache.org/licenses/LICENSE-2.0 252 | 253 | Unless required by applicable law or agreed to in writing, software 254 | distributed under the License is distributed on an "AS IS" BASIS, 255 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 256 | See the License for the specific language governing permissions and 257 | limitations under the License. 258 | 259 | 260 | 261 | 262 | 263 | -------------------------------------------------------------------------------- /README_ch.md: -------------------------------------------------------------------------------- 1 | # EasyRecyclerView 2 | [中文](https://github.com/Jude95/EasyRecyclerView/blob/master/README_ch.md) | [English](https://github.com/Jude95/EasyRecyclerView/blob/master/README.md) 3 | 4 | 将开发中常用的RecyclerView的各种需求封装进库。提升开发效率。 5 | 重点在Adapter与viewholder的封装。他们之间彻底解耦。 6 | adapter工作更少,仅负责业务逻辑。所以如果你使用mvp架构可以放进presenter层。 7 | viewholder负责View展示与Adapter没有任何耦合,将可以到处复用。并不会影响运行效率。 8 | 并且adapter支持数据管理,Header与Footer添加,加载更多。没有更多。加载错误 9 | 使用了部分[Malinskiy/SuperRecyclerView](https://github.com/Malinskiy/SuperRecyclerView)的代码,将更多功能交给了adapter实现。 10 | 11 | 12 | ## 依赖 13 | ```groovy 14 | compile 'com.jude:easyrecyclerview:4.4.2' 15 | ``` 16 | 17 | ## 示例 18 | ![recycler.gif](recycler3.gif) 19 | ## EasyRecyclerView的使用 20 | 21 | ```xml 22 | 38 | ``` 39 | 所有属性都不是必须。 40 | 注意EasyRecyclerView本质并不是一个RecyclerView 41 | 42 | **设置空白View&加载View&错误View** 43 | xml中 44 | ```xml 45 | app:layout_empty="@layout/view_empty" 46 | app:layout_progress="@layout/view_progress" 47 | app:layout_error="@layout/view_error" 48 | ``` 49 | 50 | 代码中 51 | ```java 52 | void setEmptyView(View emptyView) 53 | void setProgressView(View progressView) 54 | void setErrorView(View errorView) 55 | ``` 56 | 然后可以随时显示他们 57 | ```java 58 | void showEmpty() 59 | void showProgress() 60 | void showError() 61 | void showRecycler() 62 | ``` 63 | 64 | **跳到固定位置** 65 | ```java 66 | void scrollToPosition(int position); 67 | ``` 68 | 比如回到顶部什么的 69 | 70 | **下拉刷新的控制** 71 | ```java 72 | void setRefreshing(boolean isRefreshing); 73 | void setRefreshing(final boolean isRefreshing, final boolean isCallback); //第二个参数控制是否回调更新数据方法 74 | ``` 75 | ##RecyclerArrayAdapter 76 | 这个Adapter与本RecyclerView没有任何耦合。你可以使用其他adapter。也可以把本adapter用于其他RecyclerView 77 | 78 | **整合了数据增删的功能** 79 | ```java 80 | void add(T object); 81 | void addAll(Collection collection); 82 | void addAll(T ... items); 83 | void insert(T object, int index); 84 | void update(T object, int index); 85 | void remove(T object); 86 | void clear(); 87 | void sort(Comparator comparator); 88 | ``` 89 | 90 | **整合的Header与Footer的实现** 91 | ```java 92 | void addHeader(ItemView view) 93 | void addFooter(ItemView view) 94 | ``` 95 | ItemView不是view而是view生成器 96 | 对应Adapter的onCreate与onBind方法,所以onCreate后会多次onBind。 97 | 建议数据加载完毕后再add。onCreate里初始化UI。不使用onBind。 98 | 99 | ```java 100 | public interface ItemView { 101 | View onCreateView(ViewGroup parent); 102 | void onBindView(View itemView); 103 | } 104 | ``` 105 | 106 | Header与Footer完美适配`LinearLayoutManager`,`GridLayoutManager`,`StaggeredGridLayoutManager` 107 | 在GridLayoutManager模式中需额外加一句 108 | 109 | ```java 110 | //make adapter obtain a LookUp for LayoutManager,param is maxSpan。 111 | gridLayoutManager.setSpanSizeLookup(adapter.obtainGridSpanSizeLookUp(2)); 112 | ``` 113 | 114 | **整合OnItemClickListener与OnItemLongClickListener** 115 | 116 | ```java 117 | adapter.setOnItemClickListener(new RecyclerArrayAdapter.OnItemClickListener() { 118 | @Override 119 | public void onItemClick(int position) { 120 | //position不包含Header 121 | } 122 | }); 123 | 124 | adapter.setOnItemLongClickListener(new RecyclerArrayAdapter.OnItemLongClickListener() { 125 | @Override 126 | public boolean onItemLongClick(int position) { 127 | return true; 128 | } 129 | }); 130 | ``` 131 | 132 | 与在ViewHolder中给itemView设置OnClickListener等效。若重复设置ViewHolder中的设置会被替换。 133 | 如果在RecyclerView布局以后再设置。需要再使用'notifyDataSetChange()'。 134 | 135 | ### 下面的功能是在adapter最后添加一个footer。来显示各种状态。 136 | 137 | **加载更多** 138 | ```java 139 | void setMore(final int res,OnMoreListener listener); 140 | void setMore(final View view,OnMoreListener listener); 141 | ``` 142 | 注意一定当添加0条数据或null时,会结束加载更多,显示没有更多。 143 | 也可以在最后一页手动调用`adapter.stopMore();` 144 | 145 | **加载错误** 146 | ```java 147 | void setError(final int res,OnErrorListener listener) 148 | void setError(final View view,OnErrorListener listener) 149 | ``` 150 | `adapter.pauseMore()`暂停加载更多,显示错误View。 151 | 暂停时如果再次添加数据。自动恢复加载更多。 152 | 当错误View再次被显示时。会恢复成加载更多view。并回掉加载更多; 153 | `adapter.resumeMore()`继续加载更多,显示加载更多View,并立即回调加载更多。 154 | 比如你可以给错误View设置点击重试。点击调用resumeMore。 155 | 156 | **没有更多** 157 | 在adapter里设置,当停止加载后就会显示在最后一个。 158 | ```java 159 | void setNoMore(final int res,OnNoMoreListener listener) 160 | void setNoMore(final View view,OnNoMoreListener listener) 161 | ``` 162 | 163 | ## BaseViewHolder\ 164 | 这个ViewHolder将每个item与adapter解耦。adapter只管实例化对应ViewHolder.每个Item的view生成,findviewbyid,UI修改都由viewHolder自己管理。 165 | 列如: 166 | 167 | ```java 168 | public class PersonViewHolder extends BaseViewHolder { 169 | private TextView mTv_name; 170 | private SimpleDraweeView mImg_face; 171 | private TextView mTv_sign; 172 | 173 | 174 | public PersonViewHolder(ViewGroup parent) { 175 | super(parent,R.layout.item_person); 176 | mTv_name = $(R.id.person_name); 177 | mTv_sign = $(R.id.person_sign); 178 | mImg_face = $(R.id.person_face); 179 | } 180 | 181 | @Override 182 | public void setData(final Person person){ 183 | mTv_name.setText(person.getName()); 184 | mTv_sign.setText(person.getSign()); 185 | mImg_face.setImageURI(Uri.parse(person.getFace())); 186 | } 187 | } 188 | 189 | ----------------------------------------------------------------------- 190 | 191 | public class PersonAdapter extends RecyclerArrayAdapter { 192 | public PersonAdapter(Context context) { 193 | super(context); 194 | } 195 | 196 | @Override 197 | public BaseViewHolder OnCreateViewHolder(ViewGroup parent, int viewType) { 198 | return new PersonViewHolder(parent); 199 | } 200 | } 201 | ``` 202 | 203 | ## Decoration 204 | 这里提供了3种常用Decoration供大家使用。 205 | **DividerDecoration** 206 | 通常用在LinearLayoutManager的情况下。在item之间添加分割线。 207 | ```java 208 | DividerDecoration itemDecoration = new DividerDecoration(Color.GRAY, Util.dip2px(this,0.5f), Util.dip2px(this,72),0);//颜色 & 高度 & 左边距 & 右边距 209 | itemDecoration.setDrawLastItem(true);//有时候你不想让最后一个item有分割线,默认true. 210 | itemDecoration.setDrawHeaderFooter(false);//是否对Header于Footer有效,默认false. 211 | recyclerView.addItemDecoration(itemDecoration); 212 | ``` 213 | 这是效果: 214 | 215 | 216 | **SpaceDecoration** 217 | 通常用于GridLayoutManager和StaggeredGridLayoutManager。在View之间添加间距。 218 | ```java 219 | SpaceDecoration itemDecoration = new SpaceDecoration((int) Utils.convertDpToPixel(8,this));//参数是距离宽度 220 | itemDecoration.setPaddingEdgeSide(true);//是否为左右2边添加padding.默认true. 221 | itemDecoration.setPaddingStart(true);//是否在给第一行的item添加上padding(不包含header).默认true. 222 | itemDecoration.setPaddingHeaderFooter(false);//是否对Header于Footer有效,默认false. 223 | recyclerView.addItemDecoration(itemDecoration); 224 | ``` 225 | 这是效果: 226 | 227 | 228 | **StickHeaderDecoration** 229 | 将Item分组,并添加每一组的Header,Header会悬浮在当前分组上。 230 | StickyHeaderAdapter用法与RecyclerView.Adapter相同。 231 | 此部分代码修改自[edubarr/header-decor](https://github.com/edubarr/header-decor) 232 | ```java 233 | StickyHeaderDecoration decoration = new StickyHeaderDecoration(new StickyHeaderAdapter(this)); 234 | decoration.setIncludeHeader(false); 235 | recyclerView.addItemDecoration(decoration); 236 | ``` 237 | for example: 238 | 239 | 240 | 241 | ## 另外 242 | 虽然与我的库没什么关系,但很多人在问就写一下吧。item的**水波纹效果** 243 | 在你item的View加上这一条属性: 244 | `android:foreground="?android:attr/selectableItemBackground"` 245 | 就好了... 246 | 247 | 248 | **详细用法请看demo** 249 | ------ 250 | 251 | 252 | License 253 | ------- 254 | 255 | Copyright 2015 Jude 256 | 257 | Licensed under the Apache License, Version 2.0 (the "License"); 258 | you may not use this file except in compliance with the License. 259 | You may obtain a copy of the License at 260 | 261 | http://www.apache.org/licenses/LICENSE-2.0 262 | 263 | Unless required by applicable law or agreed to in writing, software 264 | distributed under the License is distributed on an "AS IS" BASIS, 265 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 266 | See the License for the specific language governing permissions and 267 | limitations under the License. 268 | 269 | 270 | 271 | 272 | 273 | -------------------------------------------------------------------------------- /build.gradle: -------------------------------------------------------------------------------- 1 | // Top-level build file where you can add configuration options common to all sub-projects/modules. 2 | 3 | buildscript { 4 | repositories { 5 | jcenter() 6 | mavenCentral() 7 | google() 8 | } 9 | dependencies { 10 | classpath 'com.android.tools.build:gradle:3.0.0-alpha9' 11 | classpath 'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.7' 12 | classpath 'com.github.dcendents:android-maven-gradle-plugin:1.5' 13 | // NOTE: Do not place your application dependencies here; they belong 14 | // in the individual module build.gradle files 15 | } 16 | } 17 | 18 | allprojects { 19 | repositories { 20 | jcenter() 21 | mavenCentral() 22 | google() 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /demo/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /demo/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'com.android.application' 2 | 3 | android { 4 | compileSdkVersion 26 5 | buildToolsVersion "26.0.0" 6 | 7 | defaultConfig { 8 | applicationId "com.jude.dome" 9 | minSdkVersion 15 10 | targetSdkVersion 26 11 | versionCode 1 12 | versionName "1.0" 13 | } 14 | 15 | buildTypes { 16 | release { 17 | minifyEnabled false 18 | proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 19 | } 20 | } 21 | } 22 | 23 | dependencies { 24 | compile fileTree(include: ['*.jar'], dir: 'libs') 25 | compile 'com.android.support:recyclerview-v7:26.0.0' 26 | compile 'com.android.support:appcompat-v7:26.0.0' 27 | compile 'com.android.support:design:26.0.0' 28 | compile 'com.github.bumptech.glide:glide:3.6.1' 29 | compile 'jp.wasabeef:glide-transformations:1.3.1' 30 | compile 'com.jude:rollviewpager:1.2.9' 31 | compile project(':easyrecyclerview') 32 | compile 'com.github.clans:fab:1.6.0' 33 | 34 | } 35 | -------------------------------------------------------------------------------- /demo/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # By default, the flags in this file are appended to flags specified 3 | # in F:\software\android-sdk_r24.0.2-windows\android-sdk-windows/tools/proguard/proguard-android.txt 4 | # You can edit the include path and order by changing the proguardFiles 5 | # directive in build.gradle. 6 | # 7 | # For more details, see 8 | # http://developer.android.com/guide/developing/tools/proguard.html 9 | 10 | # Add any project specific keep options here: 11 | 12 | # If your project uses WebView with JS, uncomment the following 13 | # and specify the fully qualified class name to the JavaScript interface 14 | # class: 15 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 16 | # public *; 17 | #} 18 | -------------------------------------------------------------------------------- /demo/src/androidTest/java/com/jude/dome/ApplicationTest.java: -------------------------------------------------------------------------------- 1 | package com.jude.dome; 2 | 3 | import android.app.Application; 4 | import android.test.ApplicationTestCase; 5 | 6 | /** 7 | * Testing Fundamentals 8 | */ 9 | public class ApplicationTest extends ApplicationTestCase { 10 | public ApplicationTest() { 11 | super(Application.class); 12 | } 13 | } -------------------------------------------------------------------------------- /demo/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | 8 | 13 | 14 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 25 | 26 | 29 | 30 | 32 | 33 | 36 | 38 | 40 | 42 | 44 | 45 | 46 | 47 | -------------------------------------------------------------------------------- /demo/src/main/java/com/jude/dome/DataProvider.java: -------------------------------------------------------------------------------- 1 | package com.jude.dome; 2 | 3 | import com.jude.dome.entites.Ad; 4 | import com.jude.dome.entites.Person; 5 | import com.jude.dome.entites.Picture; 6 | 7 | import java.util.ArrayList; 8 | import java.util.List; 9 | 10 | /** 11 | * Created by Mr.Jude on 2016/1/6. 12 | */ 13 | public class DataProvider { 14 | public static List getPersonList(int page){ 15 | ArrayList arr = new ArrayList<>(); 16 | if (page >= 4)return arr; 17 | 18 | arr.add(new Person("http://i2.hdslb.com/52_52/user/61175/6117592/myface.jpg", "月の星く雪" + "————————第" + page + "页", "完结来补")); 19 | arr.add(new Person("http://i1.hdslb.com/52_52/user/6738/673856/myface.jpg", "影·蓝玉", "一看评论被***了一脸,伐开心。")); 20 | arr.add(new Person("http://i1.hdslb.com/account/face/1467772/e1afaf4a/myface.png", "i琳夏i", "(`・ω・´)")); 21 | arr.add(new Person("http://i0.hdslb.com/52_52/user/18494/1849483/myface.jpg", "Minerva。", "为啥下载不能了?π_π")); 22 | arr.add(new Person("http://i0.hdslb.com/52_52/account/face/4613528/303f4f5a/myface.png", "如歌行极", "求生肉(/TДT)/")); 23 | arr.add(new Person("http://i0.hdslb.com/52_52/account/face/611203/76c02248/myface.png", "GERM", "第一次看 看弹幕那些说什么影帝模式啥的 感觉日了狗了 让我怎么往后看啊 艹")); 24 | arr.add(new Person("http://i2.hdslb.com/52_52/user/46230/4623018/myface.jpg", "じ★ve↘魅惑", "开头吾王裙子被撩起来怎么回事!→_→")); 25 | arr.add(new Person("http://i2.hdslb.com/52_52/user/66723/6672394/myface.jpg", "道尘一梦", "@伪 · 卫宫士郎")); 26 | arr.add(new Person("http://i1.hdslb.com/user/3039/303946/myface.jpg", "潘多哥斯拉", "朋友,听说过某R吗……..我呸,听说过虫群吗?(`・ω・´)")); 27 | arr.add(new Person("http://i2.hdslb.com/account/face/9034989/aabbc52a/myface.png", "一只红发的猫", "道理我都懂,我就问,几楼开车←_←")); 28 | arr.add(new Person("http://i0.hdslb.com/account/face/1557783/8733bd7b/myface.png", "Mikuの草莓胖次", "扶..扶我起来,喝了最后这一瓶营养快线,让我撸死up")); 29 | arr.add(new Person("http://i2.hdslb.com/user/3716/371679/myface.jpg", "Absolute Field", "朋也,看过里番吗?")); 30 | arr.add(new Person("http://i1.hdslb.com/account/face/9045165/4b11d894/myface.png", "琪雅之约", "摩西摩西.警察局么?")); 31 | return arr; 32 | } 33 | 34 | public static List getAdList(){ 35 | ArrayList arr = new ArrayList<>(); 36 | arr.add(new Ad("http://i2.hdslb.com/u_user/e97a1632329cac1fa6ab3362e7233a08.jpg","http://www.bilibili.com/topic/v2/1004.html")); 37 | arr.add(new Ad("http://i1.hdslb.com/u_user/80fcc32d0b5d3565377847bd9dd06dc3.jpg","http://www.bilibili.com/topic/1003.html")); 38 | arr.add(new Ad("http://i2.hdslb.com/u_user/f19f0e44328a4190a48acf503c737c50.png","http://yoo.bilibili.com/html/activity/cq2015/index.html")); 39 | arr.add(new Ad("http://i1.hdslb.com/u_user/7ee1aeadc8257f43fa6b806717c9c398.png","http://www.bilibili.com/html/activity-acsociety.html")); 40 | return arr; 41 | } 42 | 43 | public static List getPersonWithAds(int page){ 44 | ArrayList arrAll = new ArrayList<>(); 45 | List arrAd = getAdList(); 46 | int index = 0; 47 | for (Person person : getPersonList(page)) { 48 | arrAll.add(person); 49 | //按比例混合广告 50 | if (Math.random()<0.2){ 51 | arrAll.add(arrAd.get(index%arrAd.size())); 52 | index++; 53 | } 54 | } 55 | 56 | return arrAll; 57 | } 58 | 59 | static final Picture[] VIRTUAL_PICTURE = { 60 | new Picture(566,800,"http://o84n5syhk.bkt.clouddn.com/57154327_p0.png"), 61 | new Picture(2126,1181,"http://o84n5syhk.bkt.clouddn.com/57180221_p0.jpg"), 62 | new Picture(1142,800,"http://o84n5syhk.bkt.clouddn.com/57174070_p0.jpg"), 63 | new Picture(550,778,"http://o84n5syhk.bkt.clouddn.com/57166531_p0.jpg"), 64 | new Picture(1085,755,"http://o84n5syhk.bkt.clouddn.com/57151022_p0.jpg"), 65 | new Picture(656,550,"http://o84n5syhk.bkt.clouddn.com/57172236_p0.jpg"), 66 | new Picture(1920,938,"http://o84n5syhk.bkt.clouddn.com/57174564_p0.jpg"), 67 | new Picture(1024,683,"http://o84n5syhk.bkt.clouddn.com/57156832_p0.jpg"), 68 | new Picture(723,1000,"http://o84n5syhk.bkt.clouddn.com/57151474_p0.png"), 69 | new Picture(2000,1667,"http://o84n5syhk.bkt.clouddn.com/57156623_p0.png"), 70 | }; 71 | public static ArrayList getPictures(int page){ 72 | ArrayList arrayList = new ArrayList<>(); 73 | for (int i = 0; i < VIRTUAL_PICTURE.length; i++) { 74 | arrayList.add(VIRTUAL_PICTURE[i]); 75 | } 76 | return arrayList; 77 | } 78 | 79 | static final int[] NarrowImage = { 80 | R.drawable.yy01, 81 | R.drawable.yy02, 82 | R.drawable.yy03, 83 | R.drawable.yy04, 84 | R.drawable.yy05, 85 | R.drawable.yy06, 86 | R.drawable.yy07, 87 | R.drawable.yy08, 88 | R.drawable.yy09, 89 | }; 90 | public static ArrayList getNarrowImage(int page){ 91 | ArrayList arrayList = new ArrayList<>(); 92 | if (page == 4)return arrayList; 93 | 94 | for (int i = 0; i < NarrowImage.length; i++) { 95 | arrayList.add(NarrowImage[i]); 96 | } 97 | return arrayList; 98 | } 99 | } 100 | -------------------------------------------------------------------------------- /demo/src/main/java/com/jude/dome/MainActivity.java: -------------------------------------------------------------------------------- 1 | package com.jude.dome; 2 | 3 | import android.content.Intent; 4 | import android.os.Bundle; 5 | import android.support.v7.app.AppCompatActivity; 6 | import android.view.View; 7 | import android.widget.Button; 8 | 9 | import com.jude.dome.collapsing.CollapsingActivity; 10 | import com.jude.dome.header.HeaderFooterActivity; 11 | import com.jude.dome.horizontal.HorizontalActivity; 12 | import com.jude.dome.insert.InsertActivity; 13 | import com.jude.dome.loadmore.RefreshAndMoreActivity; 14 | import com.jude.dome.multistyle.MultiStyleActivity; 15 | import com.jude.dome.staggeredgrid.StaggeredGridActivity; 16 | import com.jude.dome.sticky.StickyHeaderActivity; 17 | import com.jude.easyrecyclerview.EasyRecyclerView; 18 | 19 | /** 20 | * Created by Mr.Jude on 2016/1/6. 21 | */ 22 | public class MainActivity extends AppCompatActivity { 23 | Button refreshAndMore; 24 | Button multiStyle; 25 | Button headerAndFooter; 26 | Button collapsing; 27 | Button staggeredGrid; 28 | Button horizontal; 29 | Button stickyHeader; 30 | Button insert; 31 | 32 | @Override 33 | protected void onCreate(Bundle savedInstanceState) { 34 | super.onCreate(savedInstanceState); 35 | setContentView(R.layout.activity_main); 36 | EasyRecyclerView.DEBUG = true; 37 | refreshAndMore = (Button) findViewById(R.id.refresh_and_more); 38 | refreshAndMore.setOnClickListener(new View.OnClickListener() { 39 | @Override 40 | public void onClick(View v) { 41 | startActivity(new Intent(MainActivity.this, RefreshAndMoreActivity.class)); 42 | } 43 | }); 44 | multiStyle = (Button) findViewById(R.id.multi_style); 45 | multiStyle.setOnClickListener(new View.OnClickListener() { 46 | @Override 47 | public void onClick(View v) { 48 | startActivity(new Intent(MainActivity.this, MultiStyleActivity.class)); 49 | } 50 | }); 51 | headerAndFooter = (Button) findViewById(R.id.header_footer); 52 | headerAndFooter.setOnClickListener(new View.OnClickListener() { 53 | @Override 54 | public void onClick(View v) { 55 | startActivity(new Intent(MainActivity.this, HeaderFooterActivity.class)); 56 | } 57 | }); 58 | collapsing = (Button) findViewById(R.id.collapsing); 59 | collapsing.setOnClickListener(new View.OnClickListener() { 60 | @Override 61 | public void onClick(View v) { 62 | startActivity(new Intent(MainActivity.this, CollapsingActivity.class)); 63 | } 64 | }); 65 | staggeredGrid = (Button) findViewById(R.id.staggered_grid); 66 | staggeredGrid.setOnClickListener(new View.OnClickListener() { 67 | @Override 68 | public void onClick(View v) { 69 | startActivity(new Intent(MainActivity.this, StaggeredGridActivity.class)); 70 | } 71 | }); 72 | horizontal = (Button) findViewById(R.id.horizontal); 73 | horizontal.setOnClickListener(new View.OnClickListener() { 74 | @Override 75 | public void onClick(View v) { 76 | startActivity(new Intent(MainActivity.this, HorizontalActivity.class)); 77 | } 78 | }); stickyHeader = (Button) findViewById(R.id.stiky_header); 79 | stickyHeader.setOnClickListener(new View.OnClickListener() { 80 | @Override 81 | public void onClick(View v) { 82 | startActivity(new Intent(MainActivity.this, StickyHeaderActivity.class)); 83 | } 84 | }); 85 | insert = (Button) findViewById(R.id.insert); 86 | insert.setOnClickListener(new View.OnClickListener() { 87 | @Override 88 | public void onClick(View v) { 89 | startActivity(new Intent(MainActivity.this, InsertActivity.class)); 90 | } 91 | }); 92 | } 93 | } 94 | -------------------------------------------------------------------------------- /demo/src/main/java/com/jude/dome/Utils.java: -------------------------------------------------------------------------------- 1 | package com.jude.dome; 2 | 3 | import android.content.Context; 4 | import android.content.res.Resources; 5 | import android.util.DisplayMetrics; 6 | 7 | /** 8 | * Created by Mr.Jude on 2016/1/6. 9 | */ 10 | public class Utils { 11 | /** 12 | * This method converts dp unit to equivalent pixels, depending on device density. 13 | * 14 | * @param dp A value in dp (density independent pixels) unit. Which we need to convert into pixels 15 | * @param context Context to get resources and device specific display metrics 16 | * @return A float value to represent px equivalent to dp depending on device density 17 | */ 18 | public static float convertDpToPixel(float dp, Context context){ 19 | Resources resources = context.getResources(); 20 | DisplayMetrics metrics = resources.getDisplayMetrics(); 21 | float px = dp * (metrics.densityDpi / 160f); 22 | return px; 23 | } 24 | 25 | /** 26 | * This method converts device specific pixels to density independent pixels. 27 | * 28 | * @param px A value in px (pixels) unit. Which we need to convert into db 29 | * @param context Context to get resources and device specific display metrics 30 | * @return A float value to represent dp equivalent to px value 31 | */ 32 | public static float convertPixelsToDp(float px, Context context){ 33 | Resources resources = context.getResources(); 34 | DisplayMetrics metrics = resources.getDisplayMetrics(); 35 | float dp = px / (metrics.densityDpi / 160f); 36 | return dp; 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /demo/src/main/java/com/jude/dome/collapsing/CollapsingActivity.java: -------------------------------------------------------------------------------- 1 | package com.jude.dome.collapsing; 2 | 3 | import android.content.Intent; 4 | import android.graphics.Color; 5 | import android.net.Uri; 6 | import android.os.Bundle; 7 | import android.os.Handler; 8 | import android.support.annotation.Nullable; 9 | import android.support.v7.app.AppCompatActivity; 10 | import android.support.v7.widget.LinearLayoutManager; 11 | import android.support.v7.widget.Toolbar; 12 | import android.view.View; 13 | import android.view.ViewGroup; 14 | import android.widget.ImageView; 15 | 16 | import com.bumptech.glide.Glide; 17 | import com.jude.dome.DataProvider; 18 | import com.jude.dome.R; 19 | import com.jude.dome.entites.Ad; 20 | import com.jude.dome.loadmore.PersonAdapter; 21 | import com.jude.easyrecyclerview.EasyRecyclerView; 22 | import com.jude.easyrecyclerview.adapter.RecyclerArrayAdapter; 23 | import com.jude.rollviewpager.RollPagerView; 24 | import com.jude.rollviewpager.adapter.StaticPagerAdapter; 25 | import com.jude.rollviewpager.hintview.ColorPointHintView; 26 | 27 | import java.util.List; 28 | 29 | /** 30 | * Created by Mr.Jude on 2016/3/20. 31 | */ 32 | public class CollapsingActivity extends AppCompatActivity { 33 | EasyRecyclerView recyclerView; 34 | PersonAdapter adapter; 35 | private Handler handler = new Handler(); 36 | 37 | @Override 38 | protected void onCreate(@Nullable Bundle savedInstanceState) { 39 | super.onCreate(savedInstanceState); 40 | setContentView(R.layout.activity_collapsing); 41 | setSupportActionBar((Toolbar) findViewById(R.id.toolbar)); 42 | recyclerView = (EasyRecyclerView) findViewById(R.id.recyclerView); 43 | recyclerView.setLayoutManager(new LinearLayoutManager(this)); 44 | recyclerView.setAdapter(adapter = new PersonAdapter(this)); 45 | adapter.setMore(R.layout.view_more, new RecyclerArrayAdapter.OnLoadMoreListener() { 46 | @Override 47 | public void onLoadMore() { 48 | handler.postDelayed(new Runnable() { 49 | @Override 50 | public void run() { 51 | adapter.addAll(DataProvider.getPersonList(0)); 52 | } 53 | }, 1000); 54 | } 55 | }); 56 | adapter.addAll(DataProvider.getPersonList(0)); 57 | RollPagerView rollPagerView = (RollPagerView) findViewById(R.id.rollPagerView); 58 | rollPagerView.setHintView(new ColorPointHintView(this, Color.YELLOW,Color.GRAY)); 59 | rollPagerView.setAdapter(new BannerAdapter()); 60 | } 61 | 62 | private class BannerAdapter extends StaticPagerAdapter { 63 | private List list; 64 | public BannerAdapter(){ 65 | list = DataProvider.getAdList(); 66 | } 67 | 68 | @Override 69 | public View getView(ViewGroup container, final int position) { 70 | ImageView imageView = new ImageView(CollapsingActivity.this); 71 | imageView.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT)); 72 | imageView.setScaleType(ImageView.ScaleType.CENTER_CROP); 73 | //加载图片 74 | Glide.with(CollapsingActivity.this) 75 | .load(list.get(position).getImage()) 76 | .placeholder(R.drawable.default_image) 77 | .into(imageView); 78 | //点击事件 79 | imageView.setOnClickListener(new View.OnClickListener() { 80 | @Override 81 | public void onClick(View v) { 82 | startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(list.get(position).getUrl()))); 83 | } 84 | }); 85 | return imageView; 86 | } 87 | 88 | @Override 89 | public int getCount() { 90 | return list.size(); 91 | } 92 | } 93 | } 94 | -------------------------------------------------------------------------------- /demo/src/main/java/com/jude/dome/entites/Ad.java: -------------------------------------------------------------------------------- 1 | package com.jude.dome.entites; 2 | 3 | /** 4 | * Created by Mr.Jude on 2016/1/6. 5 | */ 6 | public class Ad { 7 | private String image; 8 | private String url; 9 | 10 | public Ad(String image, String url) { 11 | this.image = image; 12 | this.url = url; 13 | } 14 | 15 | public String getImage() { 16 | return image; 17 | } 18 | 19 | public void setImage(String image) { 20 | this.image = image; 21 | } 22 | 23 | public String getUrl() { 24 | return url; 25 | } 26 | 27 | public void setUrl(String url) { 28 | this.url = url; 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /demo/src/main/java/com/jude/dome/entites/Person.java: -------------------------------------------------------------------------------- 1 | package com.jude.dome.entites; 2 | 3 | /** 4 | * Created by Mr.Jude on 2015/7/18. 5 | */ 6 | public class Person { 7 | private String face; 8 | private String name; 9 | 10 | public Person(String face, String name, String sign) { 11 | this.face = face; 12 | this.name = name; 13 | this.sign = sign; 14 | } 15 | 16 | private String sign; 17 | 18 | public String getFace() { 19 | return face; 20 | } 21 | 22 | public void setFace(String face) { 23 | this.face = face; 24 | } 25 | 26 | public String getName() { 27 | return name; 28 | } 29 | 30 | public void setName(String name) { 31 | this.name = name; 32 | } 33 | 34 | public String getSign() { 35 | return sign; 36 | } 37 | 38 | public void setSign(String sign) { 39 | this.sign = sign; 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /demo/src/main/java/com/jude/dome/entites/Picture.java: -------------------------------------------------------------------------------- 1 | package com.jude.dome.entites; 2 | 3 | /** 4 | * Created by zhuchenxi on 16/6/1. 5 | */ 6 | 7 | public class Picture { 8 | int width; 9 | int height; 10 | String src; 11 | 12 | public Picture(int width, int height, String src) { 13 | this.width = width; 14 | this.height = height; 15 | this.src = src; 16 | } 17 | 18 | public int getWidth() { 19 | return width; 20 | } 21 | 22 | public void setWidth(int width) { 23 | this.width = width; 24 | } 25 | 26 | public int getHeight() { 27 | return height; 28 | } 29 | 30 | public void setHeight(int height) { 31 | this.height = height; 32 | } 33 | 34 | public String getSrc() { 35 | return src; 36 | } 37 | 38 | public void setSrc(String src) { 39 | this.src = src; 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /demo/src/main/java/com/jude/dome/header/BannerAdapter.java: -------------------------------------------------------------------------------- 1 | package com.jude.dome.header; 2 | 3 | import android.content.Context; 4 | import android.content.Intent; 5 | import android.net.Uri; 6 | import android.view.View; 7 | import android.view.ViewGroup; 8 | import android.widget.ImageView; 9 | 10 | import com.bumptech.glide.Glide; 11 | import com.jude.dome.DataProvider; 12 | import com.jude.dome.R; 13 | import com.jude.dome.entites.Ad; 14 | import com.jude.rollviewpager.adapter.StaticPagerAdapter; 15 | 16 | import java.util.List; 17 | 18 | public class BannerAdapter extends StaticPagerAdapter { 19 | 20 | private Context ctx; 21 | private List list; 22 | public BannerAdapter(Context ctx){ 23 | this.ctx = ctx; 24 | list = DataProvider.getAdList(); 25 | } 26 | 27 | @Override 28 | public View getView(ViewGroup container, final int position) { 29 | ImageView imageView = new ImageView(ctx); 30 | imageView.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT)); 31 | imageView.setScaleType(ImageView.ScaleType.CENTER_CROP); 32 | //加载图片 33 | Glide.with(ctx) 34 | .load(list.get(position).getImage()) 35 | .placeholder(R.drawable.default_image) 36 | .into(imageView); 37 | //点击事件 38 | imageView.setOnClickListener(new View.OnClickListener() { 39 | @Override 40 | public void onClick(View v) { 41 | ctx.startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(list.get(position).getUrl()))); 42 | } 43 | }); 44 | return imageView; 45 | } 46 | 47 | @Override 48 | public int getCount() { 49 | return list.size(); 50 | } 51 | } -------------------------------------------------------------------------------- /demo/src/main/java/com/jude/dome/header/HeaderFooterActivity.java: -------------------------------------------------------------------------------- 1 | package com.jude.dome.header; 2 | 3 | import android.graphics.Color; 4 | import android.os.Bundle; 5 | import android.os.Handler; 6 | import android.support.v4.widget.SwipeRefreshLayout; 7 | import android.support.v7.app.AppCompatActivity; 8 | import android.support.v7.widget.LinearLayoutManager; 9 | import android.support.v7.widget.RecyclerView; 10 | import android.util.TypedValue; 11 | import android.view.Gravity; 12 | import android.view.MotionEvent; 13 | import android.view.View; 14 | import android.view.ViewGroup; 15 | import android.widget.TextView; 16 | 17 | import com.jude.dome.DataProvider; 18 | import com.jude.dome.R; 19 | import com.jude.dome.Utils; 20 | import com.jude.dome.horizontal.NarrowImageAdapter; 21 | import com.jude.dome.loadmore.PersonAdapter; 22 | import com.jude.easyrecyclerview.EasyRecyclerView; 23 | import com.jude.easyrecyclerview.adapter.RecyclerArrayAdapter; 24 | import com.jude.easyrecyclerview.decoration.DividerDecoration; 25 | import com.jude.easyrecyclerview.decoration.SpaceDecoration; 26 | import com.jude.rollviewpager.RollPagerView; 27 | import com.jude.rollviewpager.Util; 28 | import com.jude.rollviewpager.hintview.ColorPointHintView; 29 | 30 | /** 31 | * Created by Mr.Jude on 2016/1/6. 32 | */ 33 | public class HeaderFooterActivity extends AppCompatActivity { 34 | private EasyRecyclerView recyclerView; 35 | private PersonAdapter adapter; 36 | @Override 37 | protected void onCreate(Bundle savedInstanceState) { 38 | super.onCreate(savedInstanceState); 39 | setContentView(R.layout.activity_recyclerview); 40 | recyclerView = (EasyRecyclerView) findViewById(R.id.recyclerView); 41 | recyclerView.setAdapter(adapter = new PersonAdapter(this)); 42 | 43 | recyclerView.setLayoutManager(new LinearLayoutManager(this)); 44 | DividerDecoration itemDecoration = new DividerDecoration(Color.GRAY, Util.dip2px(this,0.5f), Util.dip2px(this,72),0); 45 | itemDecoration.setDrawLastItem(true); 46 | itemDecoration.setDrawHeaderFooter(true); 47 | recyclerView.addItemDecoration(itemDecoration); 48 | recyclerView.setRefreshListener(new SwipeRefreshLayout.OnRefreshListener() { 49 | @Override 50 | public void onRefresh() { 51 | recyclerView.postDelayed(new Runnable() { 52 | @Override 53 | public void run() { 54 | adapter.clear(); 55 | adapter.addAll(DataProvider.getPersonList(0)); 56 | } 57 | },1500); 58 | } 59 | }); 60 | adapter.addHeader(new RecyclerArrayAdapter.ItemView() { 61 | @Override 62 | public View onCreateView(ViewGroup parent) { 63 | RollPagerView header = new RollPagerView(HeaderFooterActivity.this); 64 | header.setHintView(new ColorPointHintView(HeaderFooterActivity.this, Color.YELLOW,Color.GRAY)); 65 | header.setHintPadding(0, 0, 0, (int) Utils.convertDpToPixel(8, HeaderFooterActivity.this)); 66 | header.setPlayDelay(2000); 67 | header.setLayoutParams(new RecyclerView.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, (int) Utils.convertDpToPixel(200, HeaderFooterActivity.this))); 68 | header.setAdapter(new BannerAdapter(HeaderFooterActivity.this)); 69 | return header; 70 | } 71 | 72 | @Override 73 | public void onBindView(View headerView) { 74 | 75 | } 76 | }); 77 | adapter.addHeader(new RecyclerArrayAdapter.ItemView() { 78 | @Override 79 | public View onCreateView(ViewGroup parent) { 80 | RecyclerView recyclerView = new RecyclerView(parent.getContext()){ 81 | //为了不打扰横向RecyclerView的滑动操作,可以这样处理 82 | @Override 83 | public boolean onTouchEvent(MotionEvent event) { 84 | super.onTouchEvent(event); 85 | return true; 86 | } 87 | }; 88 | recyclerView.setLayoutParams(new RecyclerView.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,(int) Utils.convertDpToPixel(300, HeaderFooterActivity.this))); 89 | final NarrowImageAdapter adapter; 90 | recyclerView.setAdapter(adapter = new NarrowImageAdapter(parent.getContext())); 91 | recyclerView.setLayoutManager(new LinearLayoutManager(parent.getContext(),LinearLayoutManager.HORIZONTAL,false)); 92 | recyclerView.addItemDecoration(new SpaceDecoration((int) Utils.convertDpToPixel(8,parent.getContext()))); 93 | adapter.setMore(R.layout.view_more_horizontal, new RecyclerArrayAdapter.OnLoadMoreListener() { 94 | @Override 95 | public void onLoadMore() { 96 | new Handler().postDelayed(new Runnable() { 97 | @Override 98 | public void run() { 99 | adapter.addAll(DataProvider.getNarrowImage(0)); 100 | } 101 | },1000); 102 | } 103 | }); 104 | adapter.addAll(DataProvider.getNarrowImage(0)); 105 | return recyclerView; 106 | } 107 | 108 | @Override 109 | public void onBindView(View headerView) { 110 | //这里的处理别忘了 111 | ((ViewGroup)headerView).requestDisallowInterceptTouchEvent(true); 112 | } 113 | }); 114 | adapter.addFooter(new RecyclerArrayAdapter.ItemView() { 115 | @Override 116 | public View onCreateView(ViewGroup parent) { 117 | TextView tv = new TextView(HeaderFooterActivity.this); 118 | tv.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, (int) Utils.convertDpToPixel(56,HeaderFooterActivity.this))); 119 | tv.setGravity(Gravity.CENTER); 120 | tv.setTextSize(TypedValue.COMPLEX_UNIT_SP,16); 121 | tv.setText("(-_-)/~~~死宅真是恶心"); 122 | return tv; 123 | } 124 | 125 | @Override 126 | public void onBindView(View headerView) { 127 | 128 | } 129 | }); 130 | adapter.addAll(DataProvider.getPersonList(0)); 131 | } 132 | 133 | 134 | } 135 | -------------------------------------------------------------------------------- /demo/src/main/java/com/jude/dome/horizontal/HorizontalActivity.java: -------------------------------------------------------------------------------- 1 | package com.jude.dome.horizontal; 2 | 3 | import android.os.Bundle; 4 | import android.os.Handler; 5 | import android.support.annotation.Nullable; 6 | import android.support.v4.widget.SwipeRefreshLayout; 7 | import android.support.v7.app.AppCompatActivity; 8 | import android.support.v7.widget.LinearLayoutManager; 9 | 10 | import com.jude.dome.DataProvider; 11 | import com.jude.dome.R; 12 | import com.jude.dome.Utils; 13 | import com.jude.easyrecyclerview.EasyRecyclerView; 14 | import com.jude.easyrecyclerview.adapter.RecyclerArrayAdapter; 15 | import com.jude.easyrecyclerview.decoration.SpaceDecoration; 16 | 17 | /** 18 | * Created by zhuchenxi on 16/9/19. 19 | */ 20 | 21 | public class HorizontalActivity extends AppCompatActivity { 22 | private EasyRecyclerView recyclerView; 23 | private NarrowImageAdapter adapter; 24 | @Override 25 | protected void onCreate(@Nullable Bundle savedInstanceState) { 26 | super.onCreate(savedInstanceState); 27 | setContentView(R.layout.activity_horizontal); 28 | recyclerView = (EasyRecyclerView) findViewById(R.id.recyclerView); 29 | recyclerView.setAdapter(adapter = new NarrowImageAdapter(this)); 30 | recyclerView.setLayoutManager(new LinearLayoutManager(this,LinearLayoutManager.HORIZONTAL,false)); 31 | recyclerView.addItemDecoration(new SpaceDecoration((int) Utils.convertDpToPixel(8,this))); 32 | adapter.setMore(R.layout.view_more_horizontal, new RecyclerArrayAdapter.OnLoadMoreListener() { 33 | @Override 34 | public void onLoadMore() { 35 | new Handler().postDelayed(new Runnable() { 36 | @Override 37 | public void run() { 38 | adapter.addAll(DataProvider.getNarrowImage(0)); 39 | } 40 | },1000); 41 | } 42 | }); 43 | recyclerView.setRefreshListener(new SwipeRefreshLayout.OnRefreshListener() { 44 | @Override 45 | public void onRefresh() { 46 | adapter.clear(); 47 | adapter.addAll(DataProvider.getNarrowImage(0)); 48 | } 49 | }); 50 | adapter.addAll(DataProvider.getNarrowImage(0)); 51 | } 52 | 53 | } 54 | -------------------------------------------------------------------------------- /demo/src/main/java/com/jude/dome/horizontal/NarrowImageAdapter.java: -------------------------------------------------------------------------------- 1 | package com.jude.dome.horizontal; 2 | 3 | import android.content.Context; 4 | import android.view.ViewGroup; 5 | import android.widget.ImageView; 6 | 7 | import com.jude.dome.Utils; 8 | import com.jude.easyrecyclerview.adapter.BaseViewHolder; 9 | import com.jude.easyrecyclerview.adapter.RecyclerArrayAdapter; 10 | 11 | /** 12 | * Created by Mr.Jude on 2016/6/7. 13 | */ 14 | public class NarrowImageAdapter extends RecyclerArrayAdapter { 15 | public NarrowImageAdapter(Context context) { 16 | super(context); 17 | } 18 | 19 | @Override 20 | public BaseViewHolder OnCreateViewHolder(ViewGroup parent, int viewType) { 21 | return new NarrowImageViewHolder(parent); 22 | } 23 | 24 | private static class NarrowImageViewHolder extends BaseViewHolder{ 25 | ImageView imgPicture; 26 | 27 | public NarrowImageViewHolder(ViewGroup parent) { 28 | super(new ImageView(parent.getContext())); 29 | imgPicture = (ImageView) itemView; 30 | imgPicture.setLayoutParams(new ViewGroup.LayoutParams((int) Utils.convertDpToPixel(72f,getContext()), ViewGroup.LayoutParams.MATCH_PARENT)); 31 | imgPicture.setScaleType(ImageView.ScaleType.CENTER_CROP); 32 | } 33 | 34 | @Override 35 | public void setData(Integer data) { 36 | imgPicture.setImageResource(data); 37 | } 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /demo/src/main/java/com/jude/dome/insert/InsertActivity.java: -------------------------------------------------------------------------------- 1 | package com.jude.dome.insert; 2 | 3 | import android.graphics.Color; 4 | import android.os.Bundle; 5 | import android.support.annotation.Nullable; 6 | import android.support.v7.app.AppCompatActivity; 7 | import android.support.v7.widget.DefaultItemAnimator; 8 | import android.support.v7.widget.LinearLayoutManager; 9 | import android.view.Menu; 10 | import android.view.MenuItem; 11 | 12 | import com.jude.dome.DataProvider; 13 | import com.jude.dome.R; 14 | import com.jude.dome.entites.Person; 15 | import com.jude.dome.loadmore.PersonAdapter; 16 | import com.jude.easyrecyclerview.EasyRecyclerView; 17 | import com.jude.easyrecyclerview.adapter.RecyclerArrayAdapter; 18 | import com.jude.easyrecyclerview.decoration.DividerDecoration; 19 | import com.jude.rollviewpager.Util; 20 | 21 | import java.util.List; 22 | import java.util.Random; 23 | 24 | /** 25 | * Created by zhuchenxi on 2016/12/12. 26 | */ 27 | 28 | public class InsertActivity extends AppCompatActivity { 29 | private EasyRecyclerView recyclerView; 30 | private RecyclerArrayAdapter adapter; 31 | 32 | 33 | @Override 34 | protected void onCreate(@Nullable Bundle savedInstanceState) { 35 | super.onCreate(savedInstanceState); 36 | setContentView(R.layout.activity_recyclerview); 37 | recyclerView = (EasyRecyclerView) findViewById(R.id.recyclerView); 38 | recyclerView.setLayoutManager(new LinearLayoutManager(this)); 39 | DividerDecoration itemDecoration = new DividerDecoration(Color.GRAY, Util.dip2px(this, 0.5f), Util.dip2px(this, 72), 0); 40 | itemDecoration.setDrawLastItem(false); 41 | recyclerView.addItemDecoration(itemDecoration); 42 | recyclerView.setAdapterWithProgress(adapter = new PersonAdapter(this)); 43 | List persons = DataProvider.getPersonList(0); 44 | adapter.addAll(persons.subList(0, 3)); 45 | recyclerView.setItemAnimator(new DefaultItemAnimator()); 46 | } 47 | 48 | @Override 49 | public boolean onCreateOptionsMenu(Menu menu) { 50 | getMenuInflater().inflate(R.menu.menu_insert, menu); 51 | return true; 52 | } 53 | 54 | @Override 55 | public boolean onOptionsItemSelected(MenuItem item) { 56 | Random random = new Random(); 57 | int len = adapter.getCount(); 58 | if (len > 0) { 59 | int pos = random.nextInt(len); 60 | // int pos = 0; 61 | List persons = DataProvider.getPersonList(0); 62 | Person data = persons.get(random.nextInt(persons.size())); 63 | switch (item.getItemId()) { 64 | case R.id.ic_add: 65 | adapter.insert(data, pos); 66 | break; 67 | case R.id.ic_remove: 68 | adapter.remove(pos); 69 | break; 70 | case R.id.ic_refresh: 71 | adapter.update(data, pos); 72 | break; 73 | } 74 | } 75 | return true; 76 | } 77 | } 78 | -------------------------------------------------------------------------------- /demo/src/main/java/com/jude/dome/loadmore/PersonAdapter.java: -------------------------------------------------------------------------------- 1 | package com.jude.dome.loadmore; 2 | 3 | import android.content.Context; 4 | import android.view.ViewGroup; 5 | 6 | import com.jude.dome.entites.Person; 7 | import com.jude.dome.viewholder.PersonViewHolder; 8 | import com.jude.easyrecyclerview.adapter.BaseViewHolder; 9 | import com.jude.easyrecyclerview.adapter.RecyclerArrayAdapter; 10 | 11 | /** 12 | * Created by Mr.Jude on 2015/7/18. 13 | */ 14 | public class PersonAdapter extends RecyclerArrayAdapter { 15 | public PersonAdapter(Context context) { 16 | super(context); 17 | } 18 | 19 | @Override 20 | public BaseViewHolder OnCreateViewHolder(ViewGroup parent, int viewType) { 21 | return new PersonViewHolder(parent); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /demo/src/main/java/com/jude/dome/loadmore/RefreshAndMoreActivity.java: -------------------------------------------------------------------------------- 1 | package com.jude.dome.loadmore; 2 | 3 | import android.graphics.Color; 4 | import android.os.Bundle; 5 | import android.os.Handler; 6 | import android.support.v4.widget.SwipeRefreshLayout; 7 | import android.support.v7.app.AppCompatActivity; 8 | import android.support.v7.widget.LinearLayoutManager; 9 | import android.util.Log; 10 | import android.view.Menu; 11 | import android.view.MenuItem; 12 | import android.view.View; 13 | import android.view.ViewGroup; 14 | import android.widget.CheckBox; 15 | import android.widget.CompoundButton; 16 | 17 | import com.github.clans.fab.FloatingActionButton; 18 | import com.jude.dome.DataProvider; 19 | import com.jude.dome.R; 20 | import com.jude.dome.entites.Person; 21 | import com.jude.dome.viewholder.PersonViewHolder; 22 | import com.jude.easyrecyclerview.EasyRecyclerView; 23 | import com.jude.easyrecyclerview.adapter.BaseViewHolder; 24 | import com.jude.easyrecyclerview.adapter.RecyclerArrayAdapter; 25 | import com.jude.easyrecyclerview.decoration.DividerDecoration; 26 | import com.jude.rollviewpager.Util; 27 | 28 | 29 | public class RefreshAndMoreActivity extends AppCompatActivity implements RecyclerArrayAdapter.OnLoadMoreListener, SwipeRefreshLayout.OnRefreshListener{ 30 | private EasyRecyclerView recyclerView; 31 | private FloatingActionButton top; 32 | private RecyclerArrayAdapter adapter; 33 | private Handler handler = new Handler(); 34 | 35 | private int page = 0; 36 | private boolean hasNetWork = true; 37 | 38 | @Override 39 | protected void onCreate(Bundle savedInstanceState) { 40 | super.onCreate(savedInstanceState); 41 | setContentView(R.layout.activity_loadmore); 42 | 43 | top = (FloatingActionButton) findViewById(R.id.top); 44 | recyclerView = (EasyRecyclerView) findViewById(R.id.recyclerView); 45 | LinearLayoutManager layoutManager = new LinearLayoutManager(this); 46 | recyclerView.setLayoutManager(layoutManager); 47 | DividerDecoration itemDecoration = new DividerDecoration(Color.GRAY,Util.dip2px(this,16f), Util.dip2px(this,72),0); 48 | itemDecoration.setDrawLastItem(false); 49 | recyclerView.addItemDecoration(itemDecoration); 50 | 51 | recyclerView.setAdapterWithProgress(adapter = new RecyclerArrayAdapter(this) { 52 | @Override 53 | public BaseViewHolder OnCreateViewHolder(ViewGroup parent, int viewType) { 54 | return new PersonViewHolder(parent); 55 | } 56 | }); 57 | adapter.setMore(R.layout.view_more, this); 58 | adapter.setNoMore(R.layout.view_nomore); 59 | adapter.setOnItemLongClickListener(new RecyclerArrayAdapter.OnItemLongClickListener() { 60 | @Override 61 | public boolean onItemLongClick(int position) { 62 | adapter.remove(position); 63 | return true; 64 | } 65 | }); 66 | adapter.setError(R.layout.view_error, new RecyclerArrayAdapter.OnErrorListener() { 67 | @Override 68 | public void onErrorShow() { 69 | adapter.resumeMore(); 70 | } 71 | 72 | @Override 73 | public void onErrorClick() { 74 | adapter.resumeMore(); 75 | } 76 | }); 77 | 78 | top.setOnClickListener(new View.OnClickListener() { 79 | @Override 80 | public void onClick(View v) { 81 | recyclerView.scrollToPosition(0); 82 | } 83 | }); 84 | recyclerView.setRefreshListener(this); 85 | onRefresh(); 86 | } 87 | 88 | //第四页会返回空,意为数据加载结束 89 | @Override 90 | public void onLoadMore() { 91 | Log.i("EasyRecyclerView","onLoadMore"); 92 | handler.postDelayed(new Runnable() { 93 | @Override 94 | public void run() { 95 | //刷新 96 | if (!hasNetWork) { 97 | adapter.pauseMore(); 98 | return; 99 | } 100 | adapter.addAll(DataProvider.getPersonList(page)); 101 | page++; 102 | } 103 | }, 2000); 104 | } 105 | 106 | @Override 107 | public void onRefresh() { 108 | page = 0; 109 | handler.postDelayed(new Runnable() { 110 | @Override 111 | public void run() { 112 | adapter.clear(); 113 | //刷新 114 | if (!hasNetWork) { 115 | adapter.pauseMore(); 116 | return; 117 | } 118 | adapter.addAll(DataProvider.getPersonList(page)); 119 | page=1; 120 | } 121 | }, 2000); 122 | } 123 | 124 | 125 | @Override 126 | public boolean onCreateOptionsMenu(Menu menu) { 127 | getMenuInflater().inflate(R.menu.menu_main, menu); 128 | MenuItem item = menu.findItem(R.id.checkbox); 129 | CheckBox box = (CheckBox) item.getActionView(); 130 | box.setChecked(true); 131 | box.setText("网络"); 132 | box.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 133 | @Override 134 | public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 135 | hasNetWork = isChecked; 136 | } 137 | }); 138 | return true; 139 | } 140 | 141 | 142 | } 143 | -------------------------------------------------------------------------------- /demo/src/main/java/com/jude/dome/multistyle/MultiStyleActivity.java: -------------------------------------------------------------------------------- 1 | package com.jude.dome.multistyle; 2 | 3 | import android.graphics.Color; 4 | import android.os.Bundle; 5 | import android.support.v7.app.AppCompatActivity; 6 | import android.support.v7.widget.LinearLayoutManager; 7 | 8 | import com.jude.dome.DataProvider; 9 | import com.jude.dome.R; 10 | import com.jude.easyrecyclerview.EasyRecyclerView; 11 | import com.jude.easyrecyclerview.decoration.DividerDecoration; 12 | import com.jude.rollviewpager.Util; 13 | 14 | /** 15 | * Created by Mr.Jude on 2016/1/6. 16 | */ 17 | public class MultiStyleActivity extends AppCompatActivity { 18 | private EasyRecyclerView recyclerView; 19 | private PersonWithAdAdapter adapter; 20 | @Override 21 | protected void onCreate(Bundle savedInstanceState) { 22 | super.onCreate(savedInstanceState); 23 | setContentView(R.layout.activity_recyclerview); 24 | recyclerView = (EasyRecyclerView) findViewById(R.id.recyclerView); 25 | recyclerView.setLayoutManager(new LinearLayoutManager(this)); 26 | recyclerView.setProgressView(R.layout.view_progress); 27 | DividerDecoration itemDecoration = new DividerDecoration(Color.GRAY, Util.dip2px(this,0.5f), Util.dip2px(this,72),0); 28 | recyclerView.addItemDecoration(itemDecoration); 29 | adapter = new PersonWithAdAdapter(this); 30 | adapter.addAll(DataProvider.getPersonWithAds(0)); 31 | recyclerView.setAdapterWithProgress(adapter); 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /demo/src/main/java/com/jude/dome/multistyle/PersonWithAdAdapter.java: -------------------------------------------------------------------------------- 1 | package com.jude.dome.multistyle; 2 | 3 | import android.content.Context; 4 | import android.view.ViewGroup; 5 | 6 | import com.jude.dome.entites.Ad; 7 | import com.jude.dome.entites.Person; 8 | import com.jude.dome.viewholder.AdViewHolder; 9 | import com.jude.dome.viewholder.PersonViewHolder; 10 | import com.jude.easyrecyclerview.adapter.BaseViewHolder; 11 | import com.jude.easyrecyclerview.adapter.RecyclerArrayAdapter; 12 | 13 | import java.security.InvalidParameterException; 14 | 15 | /** 16 | * Created by Mr.Jude on 2015/7/18. 17 | */ 18 | public class PersonWithAdAdapter extends RecyclerArrayAdapter { 19 | public static final int TYPE_INVALID = 0; 20 | public static final int TYPE_AD = 1; 21 | public static final int TYPE_PERSON = 2; 22 | public PersonWithAdAdapter(Context context) { 23 | super(context); 24 | } 25 | 26 | @Override 27 | public int getViewType(int position) { 28 | if(getItem(position) instanceof Ad){ 29 | return TYPE_AD; 30 | }else if (getItem(position) instanceof Person){ 31 | return TYPE_PERSON; 32 | } 33 | return TYPE_INVALID; 34 | } 35 | 36 | @Override 37 | public BaseViewHolder OnCreateViewHolder(ViewGroup parent, int viewType) { 38 | switch (viewType){ 39 | case TYPE_PERSON: 40 | return new PersonViewHolder(parent); 41 | case TYPE_AD: 42 | return new AdViewHolder(parent); 43 | default: 44 | throw new InvalidParameterException(); 45 | } 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /demo/src/main/java/com/jude/dome/staggeredgrid/ImageAdapter.java: -------------------------------------------------------------------------------- 1 | package com.jude.dome.staggeredgrid; 2 | 3 | import android.content.Context; 4 | import android.view.ViewGroup; 5 | 6 | import com.jude.dome.entites.Picture; 7 | import com.jude.dome.viewholder.ImageViewHolder; 8 | import com.jude.easyrecyclerview.adapter.BaseViewHolder; 9 | import com.jude.easyrecyclerview.adapter.RecyclerArrayAdapter; 10 | 11 | /** 12 | * Created by Mr.Jude on 2016/6/7. 13 | */ 14 | public class ImageAdapter extends RecyclerArrayAdapter { 15 | public ImageAdapter(Context context) { 16 | super(context); 17 | } 18 | 19 | @Override 20 | public BaseViewHolder OnCreateViewHolder(ViewGroup parent, int viewType) { 21 | return new ImageViewHolder(parent); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /demo/src/main/java/com/jude/dome/staggeredgrid/StaggeredGridActivity.java: -------------------------------------------------------------------------------- 1 | package com.jude.dome.staggeredgrid; 2 | 3 | import android.graphics.Color; 4 | import android.os.Bundle; 5 | import android.support.annotation.Nullable; 6 | import android.support.v4.widget.SwipeRefreshLayout; 7 | import android.support.v7.app.AppCompatActivity; 8 | import android.support.v7.widget.GridLayoutManager; 9 | import android.support.v7.widget.RecyclerView; 10 | import android.support.v7.widget.StaggeredGridLayoutManager; 11 | import android.view.View; 12 | import android.view.ViewGroup; 13 | 14 | import com.jude.dome.DataProvider; 15 | import com.jude.dome.R; 16 | import com.jude.dome.Utils; 17 | import com.jude.dome.header.BannerAdapter; 18 | import com.jude.easyrecyclerview.EasyRecyclerView; 19 | import com.jude.easyrecyclerview.adapter.RecyclerArrayAdapter; 20 | import com.jude.easyrecyclerview.decoration.SpaceDecoration; 21 | import com.jude.rollviewpager.RollPagerView; 22 | import com.jude.rollviewpager.hintview.ColorPointHintView; 23 | 24 | /** 25 | * Created by Mr.Jude on 2016/6/7. 26 | */ 27 | public class StaggeredGridActivity extends AppCompatActivity { 28 | private EasyRecyclerView recyclerView; 29 | private ImageAdapter adapter; 30 | 31 | @Override 32 | protected void onCreate(@Nullable Bundle savedInstanceState) { 33 | super.onCreate(savedInstanceState); 34 | setContentView(R.layout.activity_recyclerview); 35 | recyclerView = (EasyRecyclerView) findViewById(R.id.recyclerView); 36 | recyclerView.setLayoutManager(new StaggeredGridLayoutManager(4,StaggeredGridLayoutManager.VERTICAL)); 37 | recyclerView.setAdapter(adapter = new ImageAdapter(this)); 38 | GridLayoutManager gridLayoutManager = new GridLayoutManager(this,4); 39 | gridLayoutManager.setSpanSizeLookup(adapter.obtainGridSpanSizeLookUp(4)); 40 | recyclerView.setLayoutManager(gridLayoutManager); 41 | adapter.addHeader(new RecyclerArrayAdapter.ItemView() { 42 | @Override 43 | public View onCreateView(ViewGroup parent) { 44 | RollPagerView header = new RollPagerView(StaggeredGridActivity.this); 45 | header.setHintView(new ColorPointHintView(StaggeredGridActivity.this, Color.YELLOW,Color.GRAY)); 46 | header.setHintPadding(0, 0, 0, (int) Utils.convertDpToPixel(8, StaggeredGridActivity.this)); 47 | header.setPlayDelay(2000); 48 | header.setLayoutParams(new RecyclerView.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, (int) Utils.convertDpToPixel(200, StaggeredGridActivity.this))); 49 | header.setAdapter(new BannerAdapter(StaggeredGridActivity.this)); 50 | return header; 51 | } 52 | 53 | @Override 54 | public void onBindView(View headerView) { 55 | 56 | } 57 | }); 58 | SpaceDecoration itemDecoration = new SpaceDecoration((int) Utils.convertDpToPixel(8,this)); 59 | itemDecoration.setPaddingEdgeSide(true); 60 | itemDecoration.setPaddingStart(true); 61 | itemDecoration.setPaddingHeaderFooter(true); 62 | recyclerView.addItemDecoration(itemDecoration); 63 | adapter.setMore(R.layout.view_more, new RecyclerArrayAdapter.OnMoreListener() { 64 | @Override 65 | public void onMoreShow() { 66 | addData(); 67 | } 68 | 69 | @Override 70 | public void onMoreClick() { 71 | 72 | } 73 | }); 74 | adapter.setNoMore(R.layout.view_nomore); 75 | recyclerView.setRefreshListener(new SwipeRefreshLayout.OnRefreshListener() { 76 | @Override 77 | public void onRefresh() { 78 | recyclerView.postDelayed(new Runnable() { 79 | @Override 80 | public void run() { 81 | adapter.clear(); 82 | adapter.addAll(DataProvider.getPictures(0)); 83 | } 84 | },1000); 85 | } 86 | }); 87 | addData(); 88 | } 89 | 90 | private void addData(){ 91 | recyclerView.postDelayed(new Runnable() { 92 | @Override 93 | public void run() { 94 | adapter.addAll(DataProvider.getPictures(0)); 95 | } 96 | },1000); 97 | } 98 | } 99 | -------------------------------------------------------------------------------- /demo/src/main/java/com/jude/dome/sticky/StickyHeaderActivity.java: -------------------------------------------------------------------------------- 1 | package com.jude.dome.sticky; 2 | 3 | import android.graphics.Color; 4 | import android.os.Bundle; 5 | import android.os.Handler; 6 | import android.support.v4.widget.SwipeRefreshLayout; 7 | import android.support.v7.app.AppCompatActivity; 8 | import android.support.v7.widget.LinearLayoutManager; 9 | import android.util.Log; 10 | import android.view.Menu; 11 | import android.view.MenuItem; 12 | import android.view.View; 13 | import android.view.ViewGroup; 14 | import android.widget.CheckBox; 15 | import android.widget.CompoundButton; 16 | 17 | import com.github.clans.fab.FloatingActionButton; 18 | import com.jude.dome.DataProvider; 19 | import com.jude.dome.R; 20 | import com.jude.dome.entites.Person; 21 | import com.jude.dome.viewholder.PersonViewHolder; 22 | import com.jude.easyrecyclerview.EasyRecyclerView; 23 | import com.jude.easyrecyclerview.adapter.BaseViewHolder; 24 | import com.jude.easyrecyclerview.adapter.RecyclerArrayAdapter; 25 | import com.jude.easyrecyclerview.decoration.DividerDecoration; 26 | import com.jude.easyrecyclerview.decoration.StickyHeaderDecoration; 27 | import com.jude.rollviewpager.Util; 28 | 29 | 30 | public class StickyHeaderActivity extends AppCompatActivity implements RecyclerArrayAdapter.OnLoadMoreListener, SwipeRefreshLayout.OnRefreshListener { 31 | private EasyRecyclerView recyclerView; 32 | private FloatingActionButton top; 33 | private RecyclerArrayAdapter adapter; 34 | private Handler handler = new Handler(); 35 | 36 | private int page = 0; 37 | private boolean hasNetWork = true; 38 | 39 | @Override 40 | protected void onCreate(Bundle savedInstanceState) { 41 | super.onCreate(savedInstanceState); 42 | setContentView(R.layout.activity_loadmore); 43 | 44 | top = (FloatingActionButton) findViewById(R.id.top); 45 | recyclerView = (EasyRecyclerView) findViewById(R.id.recyclerView); 46 | recyclerView.setLayoutManager(new LinearLayoutManager(this)); 47 | DividerDecoration itemDecoration = new DividerDecoration(Color.GRAY, Util.dip2px(this, 0.5f), Util.dip2px(this, 72), 0); 48 | itemDecoration.setDrawLastItem(false); 49 | recyclerView.addItemDecoration(itemDecoration); 50 | 51 | 52 | recyclerView.setAdapterWithProgress(adapter = new RecyclerArrayAdapter(this) { 53 | @Override 54 | public BaseViewHolder OnCreateViewHolder(ViewGroup parent, int viewType) { 55 | return new PersonViewHolder(parent); 56 | } 57 | }); 58 | adapter.setMore(R.layout.view_more, this); 59 | adapter.setNoMore(R.layout.view_nomore, new RecyclerArrayAdapter.OnNoMoreListener() { 60 | @Override 61 | public void onNoMoreShow() { 62 | adapter.resumeMore(); 63 | } 64 | 65 | @Override 66 | public void onNoMoreClick() { 67 | adapter.resumeMore(); 68 | } 69 | }); 70 | adapter.setOnItemLongClickListener(new RecyclerArrayAdapter.OnItemLongClickListener() { 71 | @Override 72 | public boolean onItemLongClick(int position) { 73 | adapter.remove(position); 74 | return true; 75 | } 76 | }); 77 | adapter.setError(R.layout.view_error, new RecyclerArrayAdapter.OnErrorListener() { 78 | @Override 79 | public void onErrorShow() { 80 | adapter.resumeMore(); 81 | } 82 | 83 | @Override 84 | public void onErrorClick() { 85 | adapter.resumeMore(); 86 | } 87 | }); 88 | // StickyHeader 89 | StickyHeaderDecoration decoration = new StickyHeaderDecoration(new StickyHeaderAdapter(this)); 90 | decoration.setIncludeHeader(false); 91 | recyclerView.addItemDecoration(decoration); 92 | top.setOnClickListener(new View.OnClickListener() { 93 | @Override 94 | public void onClick(View v) { 95 | recyclerView.scrollToPosition(0); 96 | } 97 | }); 98 | recyclerView.setRefreshListener(this); 99 | onRefresh(); 100 | 101 | } 102 | 103 | //第四页会返回空,意为数据加载结束 104 | @Override 105 | public void onLoadMore() { 106 | Log.i("EasyRecyclerView", "onLoadMore"); 107 | handler.postDelayed(new Runnable() { 108 | @Override 109 | public void run() { 110 | //刷新 111 | if (!hasNetWork) { 112 | adapter.pauseMore(); 113 | return; 114 | } 115 | adapter.addAll(DataProvider.getPersonList(page)); 116 | page++; 117 | } 118 | }, 2000); 119 | } 120 | 121 | @Override 122 | public void onRefresh() { 123 | page = 0; 124 | handler.postDelayed(new Runnable() { 125 | @Override 126 | public void run() { 127 | adapter.clear(); 128 | //刷新 129 | if (!hasNetWork) { 130 | adapter.pauseMore(); 131 | return; 132 | } 133 | adapter.addAll(DataProvider.getPersonList(page)); 134 | page = 1; 135 | } 136 | }, 2000); 137 | } 138 | 139 | 140 | @Override 141 | public boolean onCreateOptionsMenu(Menu menu) { 142 | getMenuInflater().inflate(R.menu.menu_main, menu); 143 | MenuItem item = menu.findItem(R.id.checkbox); 144 | CheckBox box = (CheckBox) item.getActionView(); 145 | box.setChecked(true); 146 | box.setText("网络"); 147 | box.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 148 | @Override 149 | public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 150 | hasNetWork = isChecked; 151 | } 152 | }); 153 | return true; 154 | } 155 | 156 | 157 | } 158 | -------------------------------------------------------------------------------- /demo/src/main/java/com/jude/dome/sticky/StickyHeaderAdapter.java: -------------------------------------------------------------------------------- 1 | 2 | 3 | package com.jude.dome.sticky; 4 | 5 | import android.content.Context; 6 | import android.support.v7.widget.RecyclerView; 7 | import android.view.LayoutInflater; 8 | import android.view.View; 9 | import android.view.ViewGroup; 10 | import android.widget.TextView; 11 | 12 | import com.jude.dome.R; 13 | import com.jude.easyrecyclerview.decoration.StickyHeaderDecoration; 14 | 15 | /** 16 | * 当前类注释:悬浮headerAdapter 17 | * PackageName:com.jude.dome.sticky 18 | * Created by Qyang on 16/11/4 19 | * Email: yczx27@163.com 20 | */ 21 | public class StickyHeaderAdapter implements StickyHeaderDecoration.IStickyHeaderAdapter { 22 | 23 | private LayoutInflater mInflater; 24 | 25 | public StickyHeaderAdapter(Context context) { 26 | mInflater = LayoutInflater.from(context); 27 | } 28 | 29 | @Override 30 | public long getHeaderId(int position) { 31 | return position / 3; 32 | } 33 | 34 | @Override 35 | public HeaderHolder onCreateHeaderViewHolder(ViewGroup parent) { 36 | final View view = mInflater.inflate(R.layout.header_item, parent, false); 37 | return new HeaderHolder(view); 38 | } 39 | 40 | @Override 41 | public void onBindHeaderViewHolder(HeaderHolder viewholder, int position) { 42 | viewholder.header.setText("第"+getHeaderId(position)+"组"); 43 | } 44 | 45 | class HeaderHolder extends RecyclerView.ViewHolder { 46 | public TextView header; 47 | 48 | public HeaderHolder(View itemView) { 49 | super(itemView); 50 | header = (TextView) itemView; 51 | } 52 | } 53 | } 54 | -------------------------------------------------------------------------------- /demo/src/main/java/com/jude/dome/viewholder/AdViewHolder.java: -------------------------------------------------------------------------------- 1 | package com.jude.dome.viewholder; 2 | 3 | import android.content.Intent; 4 | import android.net.Uri; 5 | import android.support.v7.widget.RecyclerView; 6 | import android.view.View; 7 | import android.view.ViewGroup; 8 | import android.widget.ImageView; 9 | 10 | import com.bumptech.glide.Glide; 11 | import com.jude.dome.R; 12 | import com.jude.dome.Utils; 13 | import com.jude.dome.entites.Ad; 14 | import com.jude.easyrecyclerview.adapter.BaseViewHolder; 15 | 16 | /** 17 | * Created by Mr.Jude on 2016/1/6. 18 | */ 19 | public class AdViewHolder extends BaseViewHolder { 20 | public AdViewHolder(ViewGroup parent) { 21 | super(new ImageView(parent.getContext())); 22 | ImageView imageView = (ImageView) itemView; 23 | imageView.setLayoutParams(new RecyclerView.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, (int)Utils.convertDpToPixel(156,getContext()))); 24 | imageView.setScaleType(ImageView.ScaleType.CENTER_CROP); 25 | } 26 | 27 | @Override 28 | public void setData(final Ad data) { 29 | ImageView imageView = (ImageView) itemView; 30 | Glide.with(getContext()) 31 | .load(data.getImage()) 32 | .placeholder(R.drawable.default_image) 33 | .into(imageView); 34 | imageView.setOnClickListener(new View.OnClickListener() { 35 | @Override 36 | public void onClick(View v) { 37 | getContext().startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(data.getUrl()))); 38 | } 39 | }); 40 | } 41 | 42 | } 43 | -------------------------------------------------------------------------------- /demo/src/main/java/com/jude/dome/viewholder/ImageViewHolder.java: -------------------------------------------------------------------------------- 1 | package com.jude.dome.viewholder; 2 | 3 | import android.util.DisplayMetrics; 4 | import android.view.ViewGroup; 5 | import android.widget.ImageView; 6 | 7 | import com.bumptech.glide.Glide; 8 | import com.jude.dome.entites.Picture; 9 | import com.jude.easyrecyclerview.adapter.BaseViewHolder; 10 | 11 | /** 12 | * Created by zhuchenxi on 16/6/2. 13 | */ 14 | 15 | public class ImageViewHolder extends BaseViewHolder { 16 | ImageView imgPicture; 17 | 18 | public ImageViewHolder(ViewGroup parent) { 19 | super(new ImageView(parent.getContext())); 20 | imgPicture = (ImageView) itemView; 21 | imgPicture.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT)); 22 | imgPicture.setScaleType(ImageView.ScaleType.CENTER_CROP); 23 | } 24 | 25 | @Override 26 | public void setData(Picture data) { 27 | ViewGroup.LayoutParams params = imgPicture.getLayoutParams(); 28 | 29 | DisplayMetrics dm = getContext().getResources().getDisplayMetrics(); 30 | int width = dm.widthPixels/2;//宽度为屏幕宽度一半 31 | int height = data.getHeight()*width/data.getWidth();//计算View的高度 32 | 33 | params.height = height; 34 | imgPicture.setLayoutParams(params); 35 | Glide.with(getContext()) 36 | .load(data.getSrc()+"?imageView2/0/w/"+ width) 37 | .into(imgPicture); 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /demo/src/main/java/com/jude/dome/viewholder/PersonViewHolder.java: -------------------------------------------------------------------------------- 1 | package com.jude.dome.viewholder; 2 | 3 | import android.util.Log; 4 | import android.view.ViewGroup; 5 | import android.widget.ImageView; 6 | import android.widget.TextView; 7 | 8 | import com.bumptech.glide.Glide; 9 | import com.jude.dome.R; 10 | import com.jude.dome.entites.Person; 11 | import com.jude.easyrecyclerview.adapter.BaseViewHolder; 12 | 13 | import jp.wasabeef.glide.transformations.CropCircleTransformation; 14 | 15 | 16 | /** 17 | * Created by Mr.Jude on 2015/2/22. 18 | */ 19 | public class PersonViewHolder extends BaseViewHolder { 20 | private TextView mTv_name; 21 | private ImageView mImg_face; 22 | private TextView mTv_sign; 23 | 24 | 25 | public PersonViewHolder(ViewGroup parent) { 26 | super(parent, R.layout.item_person); 27 | mTv_name = $(R.id.person_name); 28 | mTv_sign = $(R.id.person_sign); 29 | mImg_face = $(R.id.person_face); 30 | } 31 | 32 | @Override 33 | public void setData(final Person person){ 34 | Log.i("ViewHolder","position"+getDataPosition()); 35 | mTv_name.setText(person.getName()); 36 | mTv_sign.setText(person.getSign()); 37 | Glide.with(getContext()) 38 | .load(person.getFace()) 39 | .placeholder(R.drawable.default_image) 40 | .bitmapTransform(new CropCircleTransformation(getContext())) 41 | .into(mImg_face); 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /demo/src/main/res/drawable-xxhdpi/default_image.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Jude95/EasyRecyclerView/173ef7c5d053c8d82ca2f805cacccc3e2b6827d8/demo/src/main/res/drawable-xxhdpi/default_image.png -------------------------------------------------------------------------------- /demo/src/main/res/drawable-xxhdpi/header.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Jude95/EasyRecyclerView/173ef7c5d053c8d82ca2f805cacccc3e2b6827d8/demo/src/main/res/drawable-xxhdpi/header.jpg -------------------------------------------------------------------------------- /demo/src/main/res/drawable-xxhdpi/ic_add.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Jude95/EasyRecyclerView/173ef7c5d053c8d82ca2f805cacccc3e2b6827d8/demo/src/main/res/drawable-xxhdpi/ic_add.png -------------------------------------------------------------------------------- /demo/src/main/res/drawable-xxhdpi/ic_refresh.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Jude95/EasyRecyclerView/173ef7c5d053c8d82ca2f805cacccc3e2b6827d8/demo/src/main/res/drawable-xxhdpi/ic_refresh.png -------------------------------------------------------------------------------- /demo/src/main/res/drawable-xxhdpi/ic_remove.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Jude95/EasyRecyclerView/173ef7c5d053c8d82ca2f805cacccc3e2b6827d8/demo/src/main/res/drawable-xxhdpi/ic_remove.png -------------------------------------------------------------------------------- /demo/src/main/res/drawable-xxhdpi/ic_top.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Jude95/EasyRecyclerView/173ef7c5d053c8d82ca2f805cacccc3e2b6827d8/demo/src/main/res/drawable-xxhdpi/ic_top.png -------------------------------------------------------------------------------- /demo/src/main/res/drawable-xxhdpi/star.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Jude95/EasyRecyclerView/173ef7c5d053c8d82ca2f805cacccc3e2b6827d8/demo/src/main/res/drawable-xxhdpi/star.png -------------------------------------------------------------------------------- /demo/src/main/res/drawable-xxhdpi/yy01.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Jude95/EasyRecyclerView/173ef7c5d053c8d82ca2f805cacccc3e2b6827d8/demo/src/main/res/drawable-xxhdpi/yy01.jpg -------------------------------------------------------------------------------- /demo/src/main/res/drawable-xxhdpi/yy02.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Jude95/EasyRecyclerView/173ef7c5d053c8d82ca2f805cacccc3e2b6827d8/demo/src/main/res/drawable-xxhdpi/yy02.jpg -------------------------------------------------------------------------------- /demo/src/main/res/drawable-xxhdpi/yy03.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Jude95/EasyRecyclerView/173ef7c5d053c8d82ca2f805cacccc3e2b6827d8/demo/src/main/res/drawable-xxhdpi/yy03.jpg -------------------------------------------------------------------------------- /demo/src/main/res/drawable-xxhdpi/yy04.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Jude95/EasyRecyclerView/173ef7c5d053c8d82ca2f805cacccc3e2b6827d8/demo/src/main/res/drawable-xxhdpi/yy04.jpg -------------------------------------------------------------------------------- /demo/src/main/res/drawable-xxhdpi/yy05.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Jude95/EasyRecyclerView/173ef7c5d053c8d82ca2f805cacccc3e2b6827d8/demo/src/main/res/drawable-xxhdpi/yy05.jpg -------------------------------------------------------------------------------- /demo/src/main/res/drawable-xxhdpi/yy06.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Jude95/EasyRecyclerView/173ef7c5d053c8d82ca2f805cacccc3e2b6827d8/demo/src/main/res/drawable-xxhdpi/yy06.jpg -------------------------------------------------------------------------------- /demo/src/main/res/drawable-xxhdpi/yy07.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Jude95/EasyRecyclerView/173ef7c5d053c8d82ca2f805cacccc3e2b6827d8/demo/src/main/res/drawable-xxhdpi/yy07.jpg -------------------------------------------------------------------------------- /demo/src/main/res/drawable-xxhdpi/yy08.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Jude95/EasyRecyclerView/173ef7c5d053c8d82ca2f805cacccc3e2b6827d8/demo/src/main/res/drawable-xxhdpi/yy08.jpg -------------------------------------------------------------------------------- /demo/src/main/res/drawable-xxhdpi/yy09.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Jude95/EasyRecyclerView/173ef7c5d053c8d82ca2f805cacccc3e2b6827d8/demo/src/main/res/drawable-xxhdpi/yy09.jpg -------------------------------------------------------------------------------- /demo/src/main/res/layout/activity_collapsing.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 15 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 39 | 40 | 46 | 47 | 48 | 55 | 64 | -------------------------------------------------------------------------------- /demo/src/main/res/layout/activity_horizontal.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 15 | 16 | -------------------------------------------------------------------------------- /demo/src/main/res/layout/activity_loadmore.xml: -------------------------------------------------------------------------------- 1 | 7 | 8 | 9 | 17 | 18 | 28 | 29 | 30 | -------------------------------------------------------------------------------- /demo/src/main/res/layout/activity_main.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 |