安卓学习笔记---RecyclerView的五大开源项目-解决办法

本文介绍了五个优秀的RecyclerView开源项目,包括SwipeToLoadLayout、UltimateRecyclerView、IRecyclerView、PullLoadMoreRecyclerView和HeaderAndFooterRecyclerView,详细阐述了它们的功能、使用方法及应用场景。

RecyclerView的五大开源项目-解决办法

好的东西就分享一下尊重原创:

转载地址:

http://www.2cto.com/kf/201604/499601.html


<code>前段时间做项目由于采用的MD设计,所以必须要使用RecyclerView全面代替ListView。但是开发中遇到了需要实现RecyclerView上拉加载、下拉刷新和添加Header以及Footer等需求问题,现将问题解决中用到的五大开源项目总结下来,方便他人。
</code>

首先介绍下RecyclerView,RecyclerView相比ListView增加了很多新特性:

? Adapter中的ViewHolder模式 - 对于ListView来说,通过创建ViewHolder来提升性能并不是必须的。因为ListView并没有严格的ViewHolder设计模式。但是在使用RecyclerView的时候,Adapter必须实现至少一个ViewHolder,必须遵循ViewHolder设计模式。
? 定制Item条目 - ListView只能实现垂直线性排列的列表视图,与之不同的是,RecyclerView可以通过设置RecyclerView.LayoutManager来定制不同风格的视图,比如水平滚动列表或者不规则的瀑布流列表。
? Item动画 - 在ListView中没有提供任何方法或者接口,方便开发者实现Item的增删动画。相反地,可以通过设置RecyclerView的RecyclerView.ItemAnimator来为条目增加动画效果。
? 设置数据源 - 在LisView中针对不同数据封装了各种类型的Adapter,比如用来处理数组的ArrayAdapter和用来展示Database结果的CursorAdapter。相反地,在RecyclerView中必须自定义实现RecyclerView.Adapter并为其提供数据集合。
? 设置条目分割线 - 在ListView中可以通过设置android:divider属性来为两个Item间设置分割线。如果想为RecyclerView添加此效果,则必须使用RecyclerView.ItemDecoration,这种实现方式不仅更灵活,而且样式也更加丰富。
? 设置点击事件 - 在ListView中存在AdapterView.OnItemClickListener接口,用来绑定条目的点击事件。但是,很遗憾的是在RecyclerView中,并没有提供这样的接口,不过,提供了另外一个接口RcyclerView.OnItemTouchListener,用来响应条目的触摸事件。
但是……,RecyclerView不像ListView那样拥有Header和Footer,因此开发中需要我们自己去实现Header和Foote,另外开发中小伙伴们经常使用的PullToRefresh库暂时又不支持RecyclerView。和身边的很多小伙们一样,我也陷入了困境,为了不拖累项目进度,我决定亲自解(shi)决(yong)难(kai)题(yuan),做一个伸手党。

?
1
2
<code>现在将我发现的GitHub上优秀的Header、Footer、上拉加载和下拉刷新解决方案汇总如下:
</code>

(一) SwipeToLoadLayout-推荐使用

GitHub地址:https://github.com/Aspsine/SwipeToLoadLayout

?
1
2
<code>SwipeToLoadLayout支持YouTube、Google、京东等多家APP基于RecyclerView的上拉加载和下拉刷新样式,,好用的不要不要的。废话不多说,直接上图:
</code>

? ListView & GridView

这里写图片描述

? RecyclerView(With all kinds of layoutManagers)

这里写图片描述

? WebView & ScrollView & Other Views

这里写图片描述

? Google SwipeRefreshLayout style

这里写图片描述

? 京东style

这里写图片描述

? Yalantis Phoenix 样式

这里写图片描述

AndroidStudio配置方法

第一步:在你的build.gradle添加JitPack库在
repositories {
maven { url “https://jitpack.io” }
}

第二部:添加依赖库
dependencies {
compile ‘com.github.Aspsine:SwipeToLoadLayout:v1.0.2’
}

(二) UltimateRecyclerView-大名鼎鼎

GitHub地址:https://github.com/cymcsg/UltimateRecyclerView

?
1
2
<code>UltimateRecyclerView是解决RecyclerView下拉刷新,加载更多,增加头部,显示或隐藏工具栏等许多问题的知名开源框架。
</code>

包含特性如下:
? Swipe to refresh(using android.support.v4.widget.SwipeRefreshLayout)
? Many kinds of animations
? Swipe to dismiss
? Parallax or normal head view
? Drag and drop items
? Loading more when reach the last item(infinite scrolling)
? Custom views in loading more
? Showing or hiding toolbar and floating button when scrolling
? Scrollbars
? Colorful styles of swipe to refresh
? Sticky header like instagram
? Support different layout in adapter
? Loading adapter with animation

使用效果如下:

这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

AndroidStudio配置方法

第一步:在你的build.gradle添加库

?
1
2
3
4
<code class = "hljs bash" >repositories {
     jcenter()
     maven { url "http://dl.bintray.com/jjhesk/maven" }
     }</code>

第二步:添加依赖库

?
1
2
3
<code class = "hljs matlab" >dependencies{
     compile 'com.hkm.slidingmenulib:libmenu:0.4.9'
}</code>

第三步:布局文件中使用方法

?
1
<code class = "hljs avrasm" ><com.marshalchen.ultimaterecyclerview.ultimaterecyclerview android:id= "@+id/ultimate_recycler_view" android:layout_height= "fill_parent" android:layout_width= "fill_parent" ></com.marshalchen.ultimaterecyclerview.ultimaterecyclerview></code>

(三) IRecyclerView-效果最炫

GitHub地址:https://github.com/Aspsine/IRecyclerView

?
1
2
<code>IRecyclerView支持RecyclerView下拉刷新,上拉加载,定制Header和Footer。
</code>

包含特性如下:
? pull-to-refresh
? pull-to-loadmore
? customize refresh header
? customize loadmore footer
? add multiple header view
? add multiple footer view

使用效果如下:
刷新效果
这里写图片描述

AndroidStudio配置方法
第一步:在你的build.gradle添加库

?
1
2
3
4
5
6
7
<code class = "hljs r" >repositories:
allprojects {
     repositories {
         ...
         maven { url "https://jitpack.io" }
     }
}</code>

第二步:添加依赖库

?
1
2
3
<code class = "hljs matlab" >dependencies {
     compile 'com.github.Aspsine:IRecyclerView:0.0.2'
}</code>

第三步:布局文件中使用方法

?
1
<code class = "hljs avrasm" ><com.aspsine.irecyclerview.irecyclerview android:id= "@+id/iRecyclerView" android:layout_height= "match_parent" android:layout_width= "match_parent" app:loadmoreenabled= "true" app:loadmorefooterlayout= "@layout/layout_irecyclerview_load_more_footer" app:refreshenabled= "true" app:refreshheaderlayout= "@layout/layout_irecyclerview_refresh_header" xmlns:android= "http://schemas.android.com/apk/res/android" xmlns:app= "http://schemas.android.com/apk/res-auto" ></com.aspsine.irecyclerview.irecyclerview></code>

第四步:Activity/Fragment中使用

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
<code class = "hljs java" >IRecyclerView iRecyclerView = (IRecyclerView) findViewById(R.id.iRecyclerView);
 
iRecyclerView.setLayoutManager( new LinearLayoutManager( this ));
 
// an custom footer view, you can customize it yourself.
LoadMoreFooterView loadMoreFooterView = (LoadMoreFooterView) iRecyclerView.getLoadMoreFooterView();
 
// you can also add header and footer like this
// note: header and refresh header are different, footer and load more footer are different too.
iRecyclerView.addHeaderView(headerView);
iRecyclerView.addFooterView(footerView);
 
// adapter
ImageAdapter mAdapter = new ImageAdapter();
// note: here use setIAdapter(...) method not setAdapter(...)
iRecyclerView.setIAdapter(mAdapter);
 
iRecyclerView.setOnRefreshListener( new OnRefreshListener() {
     @Override
     public void onRefresh() {
 
     }
});
iRecyclerView.setOnLoadMoreListener( new OnLoadMoreListener() {
     @Override
     public void onLoadMore(View loadMoreView) {
 
     }
});
 
// set auto refreshing
iRecyclerView.post( new Runnable() {
     @Override
    public void run() {
        iRecyclerView.setRefreshing( true );
    }
});
 
// stop refreshing
iRecyclerView.setRefreshing( false );</code>

(四)PullLoadMoreRecyclerView-属性最全

GitHub地址:https://github.com/WuXiaolong/PullLoadMoreRecyclerView

?
1
2
<code>PullLoadMoreRecyclerView实现了RecyclerView下拉刷新和上拉加载更多以及RecyclerView线性、网格、瀑布流效果。
</code>

效果图如下:

这里写图片描述

使用方法
build.gradle文件

?
1
2
3
<code class = "hljs matlab" >dependencies {
   compile 'com.wuxiaolong.pullloadmorerecyclerview:library:1.0.4'
}</code>

xml引用

?
1
<code class = "hljs avrasm" ><com.wuxiaolong.pullloadmorerecyclerview.pullloadmorerecyclerview android:id= "@+id/pullLoadMoreRecyclerView" android:layout_height= "match_parent" android:layout_margin= "10dp" android:layout_width= "match_parent" ></com.wuxiaolong.pullloadmorerecyclerview.pullloadmorerecyclerview></code>

设置线性布局

?
1
2
<code class = "hljs avrasm" > mPullLoadMoreRecyclerView = (PullLoadMoreRecyclerView) view.findViewById(R.id.pullLoadMoreRecyclerView);
  mPullLoadMoreRecyclerView.setLinearLayout();</code>

设置网格布局

?
1
<code class = "hljs cs" > mPullLoadMoreRecyclerView.setGridLayout( 2 ); //参数为列数</code>

设置交错网格布局,即瀑布流效果

?
1
<code class = "hljs cs" > mPullLoadMoreRecyclerView.setStaggeredGridLayout( 2 ); //参数为列数</code>

绑定适配器

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
<code class = "hljs axapta" >mRecyclerViewAdapter = new RecyclerViewAdapter();
mPullLoadMoreRecyclerView.setAdapter(mRecyclerViewAdapter);
 
public class RecyclerViewAdapter extends RecyclerView.Adapter<recyclerviewadapter.viewholder> {
 
     public RecyclerViewAdapter() {
 
     }
 
     @Override
     public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
         View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.recycler_view_item, parent, false );
         return new ViewHolder(view);
     }
 
     @Override
     public void onBindViewHolder(ViewHolder holder, int position) {
 
     }
 
     @Override
     public int getItemCount() {
         return 0 ;
     }
 
     public class ViewHolder extends RecyclerView.ViewHolder {    
 
         public ViewHolder(View itemView) {
             super (itemView);
 
         }
     }
}</recyclerviewadapter.viewholder></code>

调用下拉刷新和加载更多

?
1
2
3
4
5
6
7
8
9
10
11
<code class = "hljs java" >mPullLoadMoreRecyclerView.setOnPullLoadMoreListener( new PullLoadMoreRecyclerView.PullLoadMoreListener() {
             @Override
             public void onRefresh() {
 
             }
 
             @Override
             public void onLoadMore() {              
 
             }
         });</code>

刷新结束

?
1
<code class = "hljs avrasm" >mPullLoadMoreRecyclerView.setPullLoadMoreCompleted();</code>

不需要下拉刷新

?
1
<code class = "hljs bash" >mPullLoadMoreRecyclerView.setPullRefreshEnable( false );</code>

不需要上拉刷新

?
1
<code class = "hljs bash" >mPullLoadMoreRecyclerView.setPushRefreshEnable( false );</code>

设置上拉刷新文字

?
1
<code class = "hljs avrasm" >mPullLoadMoreRecyclerView.setFooterViewText( "loading" );</code>

设置下拉刷新颜色

?
1
<code class = "hljs avrasm" > mPullLoadMoreRecyclerView.setColorSchemeResources(android.R.color.holo_red_dark,android.R.color.holo_blue_dark);</code>

快速Top

?
1
<code class = "hljs avrasm" > mPullLoadMoreRecyclerView.scrollToTop();</code>

(五)HeaderAndFooterRecyclerView-封装完善

GitHub地址:https://github.com/cundong/HeaderAndFooterRecyclerView

?
1
2
<code>HeaderAndFooterRecyclerView是支持addHeaderView、 addFooterView、分页加载的RecyclerView解决方案。它可以对 RecyclerView 控件进行拓展(通过RecyclerView.Adapter实现),给RecyclerView增加HeaderView、FooterView,并且不需要对你的具体业务逻辑Adapter做任何修改。同时,通过修改 FooterView State,可以动态 FooterView 赋予不同状态(加载中、加载失败、滑到最底等),可以实现 RecyclerView 分页加载数据时的 Loading/TheEnd/NetWorkError 效果。
</code>

? 添加HeaderView、FooterView
mHeaderAndFooterRecyclerViewAdapter = new HeaderAndFooterRecyclerViewAdapter(mDataAdapter);
mRecyclerView.setAdapter(mHeaderAndFooterRecyclerViewAdapter);

?
1
2
3
4
5
6
7
8
<code>    mRecyclerView.setLayoutManager( new LinearLayoutManager( this ));
 
     //add a HeaderView
     RecyclerViewUtils.setHeaderView(mRecyclerView, new SampleHeader( this ));
 
     //add a FooterView
     RecyclerViewUtils.setFooterView(mRecyclerView, new SampleFooter( this ));
</code>

? LinearLayout/GridLayout/StaggeredGridLayout布局的RecyclerView分页加载
mRecyclerView.addOnScrollListener(mOnScrollListener);
private EndlessRecyclerOnScrollListener mOnScrollListener = new EndlessRecyclerOnScrollListener() {

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<code>    @Override
     public void onLoadNextPage(View view) {
         super .onLoadNextPage(view);
 
         LoadingFooter.State state = RecyclerViewStateUtils.getFooterViewState(mRecyclerView);
         if (state == LoadingFooter.State.Loading) {
             Log.d( "@Cundong" , "the state is Loading, just wait.." );
             return ;
         }
 
         mCurrentCounter = mDataList.size();
 
         if (mCurrentCounter < TOTAL_COUNTER) {
             // loading more
             RecyclerViewStateUtils.setFooterViewState(EndlessLinearLayoutActivity. this , mRecyclerView, REQUEST_COUNT, LoadingFooter.State.Loading, null );
             requestData();
         } else {
             //the end
             RecyclerViewStateUtils.setFooterViewState(EndlessLinearLayoutActivity. this , mRecyclerView, REQUEST_COUNT, LoadingFooter.State.TheEnd, null );
         }
     }
};
</code>

注意事项

?
1
2
3
4
<code>如果已经使用 RecyclerViewUtils.setHeaderView(mRecyclerView, view); 为RecyclerView添加了HeaderView,那么再调用ViewHolder类的getAdapterPosition()、getLayoutPosition()时返回的值就会因为增加了Header而受影响(返回的position等于真实的position+headerCounter)。
因此,这种情况下请使用 RecyclerViewUtils.getAdapterPosition(mRecyclerView, ViewHolder. this )、RecyclerViewUtils.getLayoutPosition(mRecyclerView, ViewHolder. this ) 两个方法来替代。
使用效果:
</code>

? 添加HeaderView、FooterView

这里写图片描述

? 支持分页加载的LinearLayout布局RecyclerView<喎�"/kf/ware/vc/" target="_blank" class="keylink">vcD4NCjxwPjxpbWcgYWx0PQ=="这里写图片描述" src="/uploadfile/Collfiles/20160416/20160416091632342.png" title="\" />

? 支持分页加载的GridLayout布局RecyclerView

这里写图片描述

? 支持分页加载的StaggeredGridLayout布局RecyclerView

这里写图片描述

? 分页加载失败时的GridLayout布局RecyclerView

这里写图片描述

以上就是GitHub中比较好的RecyclerView开源框架,希望能对小伙伴们的开发带来帮助,更感谢这些作者们提供了这么好的东西!





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值