RecyclerView实现上下拉刷新的方式:
常用的三种:
第一种:
SwipeRefreshLayout 这是goolge官方提供的实现下拉刷新的方式用法是用SwipeRefreshLayout包裹RecyclerView
在SwipeRefreshLayout对象控件上设置下拉刷新的效果 至于上拉刷新可以通过给RecyclerView添加addScrollListener()这个监听来实现,具体代码实现如下:
//只有下拉刷新效果
refreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
@Override
public void onRefresh() {
if(curPage!=1)
{
curPage=1;
initData(curPage);
//数据加载完之后就将刷新撤掉
}
refreshLayout.setRefreshing(false);
}
});
/*
*上拉加载下一页
*/
recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
//滚动状态改变回调方法
@Override
public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
super.onScrollStateChanged(recyclerView, newState);
//如果数据源中的数据都已经显示出来且屏幕停止了滚动 那么开始加载下一屏幕的数据
if ((lastVisibleItemPosition+1==adapter.getItemCount()&&(newState ==RecyclerView.SCROLL_STATE_IDLE)))
{
curPage ++;
initData(curPage);
}
}
//滚动停止之后回调的方法
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
//停止滚动之后用布局管理器获取最后一个可见的item的位置
lastVisibleItemPosition = linearLayoutManager.findLastVisibleItemPosition();
}
});
第二种引入第三方控件
in.srain.cube.views.ptr.PtrFrameLayout 在gradle中导包使用方式也是把recyclerView包裹
具体的实现上下拉刷新的 代码如下:
//效果1 :设置默认的经典头视图
PtrClassicDefaultHeader header =new PtrClassicDefaultHeader(context);
//效果2:特殊效果 目前只支持英文字符(闪动的文字header效果)
final StoreHouseHeader storeHouseHeader =new StoreHouseHeader(this);
//storeHouseHeader.setPadding(0,30,0,0);
//头上文字背景颜色
storeHouseHeader.setBackgroundColor(Color.BLUE);
//头上文字颜色
storeHouseHeader.setTextColor(Color.WHITE);
//设置显示的文字 文字只可以是字母或者数字
storeHouseHeader.initWithString("LOADING...");
//为PtrFrameLayout设置下拉刷新的头视图
ptrFrameLayout.setHeaderView(storeHouseHeader);
//绑定ui与刷新状态的监听
ptrFrameLayout.addPtrUIHandler(storeHouseHeader);
ptrFrameLayout.autoRefresh(true);
//添加刷新的动作监听
ptrFrameLayout.setPtrHandler(new PtrDefaultHandler() {
@Override
public void onRefreshBegin(PtrFrameLayout frame) {
/*
*youwent
*/
curPage =1;
loadData(curPage);
}
});
//设置上拉刷新
recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
super.onScrollStateChanged(recyclerView, newState);
if ((lastVisibleItemPosition+1==adapter.getItemCount())&&newState==RecyclerView.SCROLL_STATE_IDLE)
{
curPage++;
loadData(curPage);
Log.i(" curPage = ;","=======>"+curPage);
}
}
//滚动完后才能之后 的回调
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
//当前页面最后一个可见元素位置
lastVisibleItemPosition = manager.findLastVisibleItemPosition();
}
});
引入模块的方式 androidstudio---file----new----import module ----引入module即可----最后海淀add 到gradle文件
布局中就使用这个第三方的RecyclerView即可
// 头部
// headerView = LayoutInflater.from(this).inflate(R.layout.header_view, null);
// 脚部
// footerView = LayoutInflater.from(this).inflate(R.layout.footer_view, null);
// 添加头部和脚部,如果不添加就使用默认的头部和脚部(头部可以有多个)
// mRecyclerView.addHeaderView(headerView);
// 设置头部的最大拉伸倍率,默认1.5f,必须写在setHeaderImage()之前
// mRecyclerView.setScaleRatio(2.0f);
// 设置下拉时拉伸的图片,不设置就使用默认的
// mRecyclerView.setHeaderImage((ImageView) headerView.findViewById(.iv_hander));
// mRecyclerView.addFootView(footerView);
private void initView() {
recyclerView = (AnimRFRecyclerView) findViewById(.animRecyclerView);
//设置布局管理器
// manager = new LinearLayoutManager(context);
AnimRFLinearLayoutManager linearLayoutManager =new AnimRFLinearLayoutManager(context);
recyclerView.setLayoutManager(linearLayoutManager);
recyclerView.addItemDecoration(new DividerGridItemDecoration(context));
recyclerView.setItemAnimator(new DefaultItemAnimator());
recyclerView.setLoadDataListener(new AnimRFRecyclerView.LoadDataListener() {
@Override
public void onRefresh() {
curPage=1;
column=1;
loadData();
//有个小问题 下拉刷新有bug
recyclerView.refreshComplate();
}
@Override
public void onLoadMore() {
curPage++;
loadData();
recyclerView.loadMoreComplate();
}
});
RecyclerView的前两种方式完全试用于ListView,ListView也被大神延伸出来了第三方的类库,PullToRefreshListView
用法也同上。
上面所有引用的第三方控件或者类库在zip文件夹中都有 而且zip文件夹中还有我做的一个小小的demo展示了上下拉刷新的实现
以及RecyclerView的多布局 CardView Toolbar登控件的使用
RecyclerView多布局的关键方法是getItemViewType 返回值是每种布局的编号,有多少种布局就需要创建多少种ViewHolder的子类
然后根据不同的itemType在 RecyclerView.ViewHolder onCreateViewHolder 返回不同的viewhoder对象
再根据不同的viewholder对象在BindViewHoder类中进行对item中的每个控件进行赋值