RecyclerView五大开源使用

首先介绍下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),做一个伸手党。

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

(一) SwipeToLoadLayout-推荐使用

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

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

• 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

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

包含特性如下:

• Swipe to refresh(usingandroid.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添加库

repositories {

jcenter()

maven { url"http://dl.bintray.com/jjhesk/maven"}

}

第二步:添加依赖库

dependencies{    compile'com.hkm.slidingmenulib:libmenu:0.4.9'}

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

< android:layout_width="fill_parent"

android:layout_height="fill_parent"

android:id="@+id/ultimate_recycler_view"/>

(三) IRecyclerView-效果最炫

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

IRecyclerView支持RecyclerView下拉刷新,上拉加载,定制Header和Footer。

包含特性如下:

• pull-to-refresh

• pull-to-loadmore

• customize refresh header

• customize loadmore footer

• add multiple header view

• add multiple footer view

使用效果如下:

刷新效果

AndroidStudio配置方法

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

repositories:allprojects {    repositories {...maven { url"https://jitpack.io"}    }}

第二步:添加依赖库

dependencies{    compile'com.github.Aspsine:IRecyclerView:0.0.2'}

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

< xmlns:app="http://schemas.android.com/apk/res-auto"

android:id="@+id/iRecyclerView"

android:layout_width="match_parent"

android:layout_height="match_parent"

app:loadMoreEnabled="true"

app:loadMoreFooterLayout="@layout/layout_irecyclerview_load_more_footer"

app:refreshEnabled="true"

app:refreshHeaderLayout="@layout/layout_irecyclerview_refresh_header"/>

第四步:Activity/Fragment中使用

IRecyclerView iRecyclerView=(IRecyclerView)findViewById(R.id.iRecyclerView);

iRecyclerView.setLayoutManager(newLinearLayoutManager(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=newImageAdapter();

// note: here use setIAdapter(...) method not setAdapter(...)

iRecyclerView.setIAdapter(mAdapter);

iRecyclerView.setOnRefreshListener(newOnRefreshListener(){

@Override

public voidonRefresh(){

}

});

iRecyclerView.setOnLoadMoreListener(newOnLoadMoreListener(){

@Override

public voidonLoadMore(ViewloadMoreView){

}

});

// set auto refreshing

iRecyclerView.post(newRunnable(){

@Override

public voidrun(){

iRecyclerView.setRefreshing(true);

}

});

// stop refreshing

iRecyclerView.setRefreshing(false);

(四)PullLoadMoreRecyclerView-属性最全

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

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

效果图如下:

使用方法

build.gradle文件

dependencies{  compile'com.wuxiaolong.pullloadmorerecyclerview:library:1.0.4'}

xml引用

< android:id="@+id/pullLoadMoreRecyclerView"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:layout_margin="10dp"/>

设置线性布局

mPullLoadMoreRecyclerView = (PullLoadMoreRecyclerView) view.findViewById(R.id.pullLoadMoreRecyclerView);mPullLoadMoreRecyclerView.setLinearLayout();

设置网格布局

mPullLoadMoreRecyclerView.setGridLayout(2);//参数为列数

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

mPullLoadMoreRecyclerView.setStaggeredGridLayout(2);//参数为列数

绑定适配器

mRecyclerViewAdapter=newRecyclerViewAdapter();

mPullLoadMoreRecyclerView.setAdapter(mRecyclerViewAdapter);

public classRecyclerViewAdapterextendsRecyclerView.Adapter {

publicRecyclerViewAdapter(){

}

@Override

publicViewHolderonCreateViewHolder(ViewGroupparent,intviewType){

Viewview=LayoutInflater.from(parent.getContext()).inflate(R.layout.recycler_view_item,parent,false);

return newViewHolder(view);

}

@Override

public voidonBindViewHolder(ViewHolderholder,intposition){

}

@Override

public intgetItemCount(){

return0;

}

public classViewHolderextendsRecyclerView.ViewHolder{

publicViewHolder(ViewitemView){

super(itemView);

}

}

}

调用下拉刷新和加载更多

mPullLoadMoreRecyclerView.setOnPullLoadMoreListener(newPullLoadMoreRecyclerView.PullLoadMoreListener(){

@Override

public voidonRefresh(){

}

@Override

public voidonLoadMore(){

}

});

刷新结束

mPullLoadMoreRecyclerView.setPullLoadMoreCompleted();

不需要下拉刷新

mPullLoadMoreRecyclerView.setPullRefreshEnable(false);

不需要上拉刷新

mPullLoadMoreRecyclerView.setPushRefreshEnable(false);

设置上拉刷新文字

mPullLoadMoreRecyclerView.setFooterViewText("loading");

设置下拉刷新颜色

mPullLoadMoreRecyclerView.setColorSchemeResources(android.R.color.holo_red_dark,android.R.color.holo_blue_dark);

快速Top

mPullLoadMoreRecyclerView.scrollToTop();

(五)HeaderAndFooterRecyclerView-封装完善

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

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

• 添加HeaderView、FooterView

mHeaderAndFooterRecyclerViewAdapter = new HeaderAndFooterRecyclerViewAdapter(mDataAdapter);

mRecyclerView.setAdapter(mHeaderAndFooterRecyclerViewAdapter);

mRecyclerView.setLayoutManager(new LinearLayoutManager(this));

//add a HeaderView

RecyclerViewUtils.setHeaderView(mRecyclerView, new SampleHeader(this));

//add a FooterView

RecyclerViewUtils.setFooterView(mRecyclerView, new SampleFooter(this));

• LinearLayout/GridLayout/StaggeredGridLayout布局的RecyclerView分页加载

mRecyclerView.addOnScrollListener(mOnScrollListener);

private EndlessRecyclerOnScrollListener mOnScrollListener = new EndlessRecyclerOnScrollListener() {

@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);

}

}

};

注意事项

如果已经使用 RecyclerViewUtils.setHeaderView(mRecyclerView, view); 为RecyclerView添加了HeaderView,那么再调用ViewHolder类的getAdapterPosition()、getLayoutPosition()时返回的值就会因为增加了Header而受影响(返回的position等于真实的position+headerCounter)。

因此,这种情况下请使用 RecyclerViewUtils.getAdapterPosition(mRecyclerView, ViewHolder.this)、RecyclerViewUtils.getLayoutPosition(mRecyclerView, ViewHolder.this) 两个方法来替代。

使用效果:

• 添加HeaderView、FooterView

• 支持分页加载的LinearLayout布局RecyclerView

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

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

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,126评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,254评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,445评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,185评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,178评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,970评论 1 284
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,276评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,927评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,400评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,883评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,997评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,646评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,213评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,204评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,423评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,423评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,722评论 2 345

推荐阅读更多精彩内容