RecycleView下拉刷新控件的封装(包括下拉刷新和加载更多 ),安卓面试题10道

3)加载更多是通过监听RecycleView的OnScrollListener

mScrollListener = new RecyclerView.OnScrollListener() {

private int mLastVisibleItem;

private int mDy;

@Override

public void onScrollStateChanged(RecyclerView recyclerView, int newState) {

super.onScrollStateChanged(recyclerView, newState);

if (newState != RecyclerView.SCROLL_STATE_IDLE) {

return;

}

//最后显示的项

mLastVisibleItem = mLayoutManager.findLastCompletelyVisibleItemPosition();

int totalItemCount = mLayoutManager.getItemCount();

/**

  • 只有在下拉,并且没有早加载更多,并且允许加载更多,并且在最后一个条目,才调用加载更多的接口

*/

if (mDy >= 0 && !isLoadMore && (mLastVisibleItem >= totalItemCount - 1) &&

enableLoadMore) {

loadMore();

}

}

2 下面给出源码

public class PulltoRefreshRecyclerView extends LinearLayout {

String Tag = “xujun”;

/**

  • 内容控件

*/

private RecyclerView mRecyclerView;

/**

  • 刷新布局控件

*/

private SwipeRefreshLayout mSwipeRfl;

private LinearLayoutManager mLayoutManager;

/*

  • 刷新布局的监听

*/

private OnRefreshListener mRefreshListener;

/**

  • 内容控件滚动监听

*/

private RecyclerView.OnScrollListener mScrollListener;

/*

  • 刷新加载监听事件

*/

private onRefreshListener mRefreshLoadMoreListner;

/**

  • 是否正在刷新

*/

private boolean isRefresh = false;

/**

  • 是否正在加载更多

*/

private boolean isLoadMore = false;

private FrameLayout mFootView;

// 是否允许加载更多

private boolean enableLoadMore = true;

private int mMeasuredHeight;

public PulltoRefreshRecyclerView(Context context) {

this(context, null);

}

@SuppressWarnings(“deprecation”)

public PulltoRefreshRecyclerView(Context context, AttributeSet attrs) {

super(context, attrs);

// 导入布局

initView(context);

/**

  • 监听上拉至底部滚动监听

*/

initListener();

mRecyclerView.setHasFixedSize(true);

mLayoutManager = new LinearLayoutManager(context);

mRecyclerView.setLayoutManager(mLayoutManager);

mRecyclerView.setOnScrollListener(mScrollListener);

}

private void setFootViewHeight(int height) {

ViewGroup.LayoutParams layoutParams = mFootView.getLayoutParams();

layoutParams.height = height;

mFootView.setLayoutParams(layoutParams);

}

private void initListener() {

mScrollListener = new RecyclerView.OnScrollListener() {

private int mLastVisibleItem;

private int mDy;

@Override

public void onScrollStateChanged(RecyclerView recyclerView, int newState) {

super.onScrollStateChanged(recyclerView, newState);

if (newState != RecyclerView.SCROLL_STATE_IDLE) {

return;

}

//最后显示的项

mLastVisibleItem = mLayoutManager.findLastCompletelyVisibleItemPosition();

int totalItemCount = mLayoutManager.getItemCount();

/**

  • 只有在下拉,并且没有早加载更多,并且允许加载更多,并且在最后一个条目,才调用加载更多的接口

*/

if (mDy >= 0 && !isLoadMore && (mLastVisibleItem >= totalItemCount - 1) &&

enableLoadMore) {

loadMore();

}

}

@Override

public void onScrolled(RecyclerView recyclerView, int dx, int dy) {

super.onScrolled(recyclerView, dx, dy);

mDy = dy;

}

};

/**

  • 下拉至顶部刷新监听

*/

mRefreshListener = new OnRefreshListener() {

@Override

public void onRefresh() {

/* Log.i(“Tag”, “onRefresh1”);

Log.i(“Tag”, isRefresh + “”);

Log.i(“Tag”, isRefresh + “”);

Log.i(“Tag”, isLoadMore + “”);*/

LUtils.i(“isLoadMore=” + isLoadMore);

if (!isRefresh && !isLoadMore) {//没有正在刷新或者正在加载更多

isRefresh = true;

refresh();

}

}

};

mSwipeRfl.setOnRefreshListener(mRefreshListener);

}

private void initView(Context context) {

View.inflate(context, R.layout.pulltorefreshrecyclerview,this);

mSwipeRfl = (SwipeRefreshLayout) findViewById(R.id.all_swipe);

mRecyclerView = (RecyclerView) findViewById(R.id.recycler_view);

initFootView();

}

private void initFootView() {

mFootView = (FrameLayout) findViewById(R.id.ll_load_more);

LUtils.i(“mFootView=” +(mFootView==null));

mFootView.measure(0, 0);

mMeasuredHeight = mFootView.getMeasuredHeight();

setFootViewHeight(0);

}

public void setFooterView(View view) {

if (getFooterView() != null) {

getFooterView().removeAllViews();

mFootView.addView(view);

}

}

public FrameLayout getFooterView() {

return mFootView;

}

public RecyclerView getRecyclerView() {

return mRecyclerView;

}

public void setLayoutManager(LayoutManager layoutManager) {

if (mRecyclerView != null) {

mRecyclerView.setLayoutManager(layoutManager);

}

}

/**

  • 设置是否允许下拉刷新

  • @param enable

*/

public void setPullRefreshEnable(boolean enable) {

setRefreshEnabled(enable);

}

public boolean getPullRefreshEnable() {

return mSwipeRfl.isEnabled();

}

public void setLoadMoreListener() {

mRecyclerView.setOnScrollListener(mScrollListener);

}

public void loadMore() {

if (mRefreshLoadMoreListner != null) {

isLoadMore = true;

//设置在加载更多的时候swipeLayout不允许加载更多,同时需要设置在加载更多完毕的时候允许swipeLayout加载更多

setRefreshEnabled(false);

mLayoutManager.scrollToPosition(mLayoutManager.findLastVisibleItemPosition());

showFootView();

mRefreshLoadMoreListner.onLoadMore(mRecyclerView);

}

}

public void setRefreshEnabled(boolean enabled) {

mSwipeRfl.setEnabled(enabled);

}

private void showFootView() {

setFootViewHeight(mMeasuredHeight);

}

public void OnRefreshCompleted() {

if (isRefresh) {//如果是正在刷新,就调用这个方法

stopRefresh();

} else if (isLoadMore) {//如果是正在加载更多,就调用这个方法

setLoadMoreCompleted();

}

}

/**

  • 加载更多完毕,为防止频繁网络请求,isLoadMore为false才可再次请求更多数据

*/

private void setLoadMoreCompleted() {

//因为在加载更多的时候设置swipeLayout不允刷新,

// 所以加载更多完毕的时候需要设置允许swipeLayout允许刷新

setRefreshEnabled(true);

isLoadMore = false;

hideFootView();

}
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

img

img

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Android)

学习交流

群内有许多来自一线的技术大牛,也有在小厂或外包公司奋斗的码农,我们致力打造一个平等,高质量的Android交流圈子,不一定能短期就让每个人的技术突飞猛进,但从长远来说,眼光,格局,长远发展的方向才是最重要的。

35岁中年危机大多是因为被短期的利益牵着走,过早压榨掉了价值,如果能一开始就树立一个正确的长远的职业规划。35岁后的你只会比周围的人更值钱。

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!**

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Android)

学习交流

[外链图片转存中…(img-1DYOmgCS-1712795193304)]

[外链图片转存中…(img-hE8eZqQc-1712795193304)]

群内有许多来自一线的技术大牛,也有在小厂或外包公司奋斗的码农,我们致力打造一个平等,高质量的Android交流圈子,不一定能短期就让每个人的技术突飞猛进,但从长远来说,眼光,格局,长远发展的方向才是最重要的。

35岁中年危机大多是因为被短期的利益牵着走,过早压榨掉了价值,如果能一开始就树立一个正确的长远的职业规划。35岁后的你只会比周围的人更值钱。

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值