Skip to content

Repository files navigation

#RecyclerView & RecyclerView.Adapter封装

开源项目:https://github.com/open-android/BaseRecyclerAndAdapter

  • 爱生活,爱学习,更爱做代码的搬运工,分类查找更方便请下载黑马助手app

黑马助手.png

使用步骤

1. 在project的build.gradle添加如下代码(如下图)

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

2. 在Module的build.gradle添加依赖

compile 'com.github.open-android:BaseRecyclerAndAdapter:0.5.13'
compile 'com.jakewharton:butterknife:8.4.0'
annotationProcessor 'com.jakewharton:butterknife-compiler:8.4.0'

3. 添加权限

<uses-permission android:name="android.permission.INTERNET"/><uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/><uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>

ItheimaRecyclerView使用方式

  • 网格RecyclerView(app:spanCount="2",spanCount取值范围[1,10])
<org.itheima.recycler.widget.ItheimaRecyclerView
android:id="@+id/recycler_view"android:layout_width="match_parent"android:layout_height="match_parent"app:spanCount="2"/>
  • 垂直滚动RecyclerView
<org.itheima.recycler.widget.ItheimaRecyclerView
android:id="@+id/recycler_view"android:layout_width="match_parent"android:layout_height="match_parent"/>
  • 横向滚动RecyclerView(11:一行,12:二行.......,spanCount取值范围[11,19])
<org.itheima.recycler.widget.ItheimaRecyclerView
android:id="@+id/recycler_view"android:layout_width="match_parent"android:layout_height="match_parent"app:spanCount="12"/>

ItheimaRecyclerView添加头

  • xml代码
<FrameLayoutandroid:layout_width="match_parent"android:layout_height="match_parent">
<org.itheima.recycler.widget.ItheimaRecyclerView
android:id="@+id/recycler_view"android:layout_width="match_parent"android:layout_height="match_parent"/>
<org.itheima.recycler.header.RecyclerViewHeader
android:id="@+id/recycler_header"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_gravity="center_horizontal|top">
<TextViewandroid:layout_width="match_parent"android:layout_height="100dp"android:text="header"/>
</org.itheima.recycler.header.RecyclerViewHeader>
</FrameLayout>
  • java代码
RecyclerViewHeaderheader = (RecyclerViewHeader) findViewById(R.id.header);
RecyclerViewrecyclerView = (RecyclerView) findViewById(R.id.recyclerview);
header.attachTo(recyclerView);

给RecyclerView的item添加点击事件和长按事件

ItemClickSupportitemClickSupport = newItemClickSupport(mRecyclerView);
//点击事件itemClickSupport.setOnItemClickListener(newItemClickSupport.OnItemClickListener() {
@OverridepublicvoidonItemClicked(RecyclerViewrecyclerView, intposition, Viewv) {
Toast.makeText(recyclerView.getContext(), "我被点击了", Toast.LENGTH_SHORT).show();
}
});
//长按事件itemClickSupport.setOnItemLongClickListener(newItemClickSupport.OnItemLongClickListener() {
@OverridepublicbooleanonItemLongClicked(RecyclerViewrecyclerView, intposition, Viewv) {
Toast.makeText(recyclerView.getContext(), "我被长按了", Toast.LENGTH_SHORT).show();
returnfalse;
}
});

BaseRecyclerAdapter使用方式

adapter = newBaseRecyclerAdapter(recyclerView
, MyRecyclerViewHolder.class
, R.layout.item_reyclerview
, datas);
//@param recyclerView//@param viewHolderClazz//@param itemResId recyclerView条目的资源id//@param datas recyclerView展示的数据集合(可以传null)

ViewHolder模板(ViewHolder如果是内部类必须加上static和public关键字)

publicstaticclassMyRecyclerViewHolderextendsBaseRecyclerViewHolder<DataBean> {
//换成你布局文件中的id@BindView(R.id.tv_title)
TextViewtvTitle;
publicMyRecyclerViewHolder(ViewGroupparentView, intitemResId) {
super(parentView, itemResId);
}
/** * 绑定数据的方法,在mData获取数据(mData声明在基类中) */@OverridepublicvoidonBindRealData() {
tvTitle.setText(mData.title);
}
/** * 给按钮添加点击事件(button改成你要添加点击事件的id) * @param v */@OnClick(R.id.button)
publicvoidclick(Viewv) {
}
}

下啦刷新 & 加载更多组合控件(下啦刷新和加载更多内部实现,你只需要在对应的ViewHolder做数据绑定即可)

  • http请求初始化
ItheimaHttp.init(context, baseUrl);//使用前必须调用(如果调用过则不需要重复调用)
  • xml布局
<android.support.v4.widget.SwipeRefreshLayout
android:id="@+id/swipe_refresh_layout"android:layout_width="match_parent"android:layout_height="match_parent">
<org.itheima.recycler.widget.ItheimaRecyclerView
android:id="@+id/recycler_view"android:layout_width="match_parent"android:layout_height="match_parent"/>
</android.support.v4.widget.SwipeRefreshLayout>
  • java代码实现布局
pullToLoadMoreRecyclerView = newPullToLoadMoreRecyclerView<Bean>(mSwipeRefreshLayout, mRecyclerView, MyRecyclerViewHolder.class) {
@OverridepublicintgetItemResId() {
//recylerview item资源idreturnR.layout.item_recylerview;
}
@OverridepublicStringgetApi() {
//接口return"order/list";
}
//是否加载更多的数据,根据业务逻辑自行判断,true表示有更多的数据,false表示没有更多的数据,如果不需要监听可以不重写该方法@OverridepublicbooleanisMoreData(BaseLoadMoreRecyclerAdapter.LoadMoreViewHolderholder) {
System.out.println("isMoreData" + holder);
returntrue;
}
};
  • 设置监听
pullToLoadMoreRecyclerView.setLoadingDataListener(newPullToLoadMoreRecyclerView.LoadingDataListener<Bean>() {
@OverridepublicvoidonRefresh() {
//监听下啦刷新,如果不需要监听可以不重新该方法L.i("setLoadingDataListener onRefresh");
}
@OverridepublicvoidonStart() {
//监听http请求开始,如果不需要监听可以不重新该方法L.i("setLoadingDataListener onStart");
}
@OverridepublicvoidonSuccess(Beano ,,Headersheaders) {
//监听http请求成功,如果不需要监听可以不重新该方法L.i("setLoadingDataListener onSuccess: " + o);
}
@OverridepublicvoidonFailure() {
//监听http请求失败,如果不需要监听可以不重新该方法L.i("setLoadingDataListener onFailure");
}
});
//添加头pullToLoadMoreRecyclerView.putHeader(key,value);
//添加请求参数pullToLoadMoreRecyclerView.putParam(key, value);
//开始请求pullToLoadMoreRecyclerView.requestData();
//控制加状态,可以在监听中处理loadMoreViewHolder.loading("加载中...");//默认文字:"加载中..."loadMoreViewHolder.loadingFinish("没有更多数据");

高级用法

//如果使用数字控制页数可以使用如下api//设置参数的keysetCurPageKey("curPage");//当前页keysetPageSizeKey("pageSize");//每一页数量的key//设置参数的值setPageSize(1);//设置每一页数量setTotalPage(20);//设置一共有多少页//如果使用其他方式分页可以设置setLoadingDataListener在onSuccess(Beano)回调中处理分页onSuccess回调在每一次加载数据成功后回调

RecyclerView多条目展示

classMyTypeAdapterextendsBaseRecyclerAdapter {
privatefinalintITEM_TYPE_1 = 0;
privatefinalintITEM_TYPE_2 = 1;
publicMyTypeAdapter(RecyclerViewrecyclerView, Listdatas) {
super(recyclerView, null, 0, datas);
}
@OverridepublicBaseRecyclerViewHolderonCreateViewHolder(ViewGroupparent, intviewType) {
//选择类型if (viewType == ITEM_TYPE_2) {
returnnewMyTypeHolder2(parent, R.layout.item_type2);
}
returnnewMyTypeHolder1(parent, R.layout.item_type1);
}
@OverridepublicintgetItemViewType(intposition) {
//根据position返回类型returnposition % 2 == 0 ? ITEM_TYPE_2 : ITEM_TYPE_1;
}
}

动态向Adapter中添加数据

//@param isLoadMore 数据是否累加//@param datas List数据adapter.addDatas(true,datas);

清空Adapter中所以数据(不推荐使用,使用adapter.addDatas(true,datas))可以实现相同的功能

adapter.clearAllData();

详细的使用方法在DEMO里面都演示啦,如果你觉得这个库还不错,请赏我一颗star吧~~~

欢迎关注微信公众号

About

BaseRecyclerAndAdapter

Topics

Resources

Stars

86 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages