RecyclerView上拉加载封装代码
作者:desireyao 发布时间:2023-05-08 21:02:05
标签:RecyclerView,上拉加载
RecyclerView上拉加载,先看效果:
网上有很多这类得框架,不过在自己的项目只用到上拉加载的功能,所以自己封装一个简单点的。
主要依赖BaseRecyPRAdapter这类
public abstract class BaseRecyPRAdapter<T> extends RecyclerView.Adapter<BaseRecyPRAdapter.BaseViewHolder> {
private static final String TAG = "BaseRecyPRAdapter";
public static final int VIEW_ITEM = 0;
public static final int VIEW_PROG = 1;
public List<T> mDataList;
private final Context mContext;
private final RecyclerView mRecyclerView;
private int totalItemCount;
private int lastVisibleItemPosition;
boolean isShowFootVieW = false;
private Handler handler = new Handler();
private static final int STATE_NORMAL = 0;
private static final int STATE_LOADING = 1;
private static final int STATE_LOAD_COMPLETE = 2;
private int mState = STATE_NORMAL;
public BaseRecyPRAdapter(Context context, RecyclerView recyclerView) {
mContext = context;
mRecyclerView = recyclerView;
if (mRecyclerView.getLayoutManager() instanceof LinearLayoutManager) {
final LinearLayoutManager linearLayoutManager = (LinearLayoutManager) recyclerView.getLayoutManager();
mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
super.onScrollStateChanged(recyclerView, newState);
int extent = recyclerView.computeVerticalScrollExtent();
int range = recyclerView.computeVerticalScrollRange();
Log.e(TAG, "\n extent = " + extent + "\n range = " + range);
if (range > extent) {
if(!isShowFootVieW){
notifyDataSetChanged();
}
isShowFootVieW = true;
} else {
isShowFootVieW = false;
}
totalItemCount = linearLayoutManager.getItemCount();
if (mState == STATE_NORMAL && newState == RecyclerView.SCROLL_STATE_IDLE &&
totalItemCount == lastVisibleItemPosition + 1 && range > extent) {
mState = STATE_LOADING;
handler.post(new Runnable() {
@Override
public void run() {
if (mLoadMoreDataListener != null) {
mLoadMoreDataListener.loadMoreData();
}
}
});
}
}
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
lastVisibleItemPosition = linearLayoutManager.findLastVisibleItemPosition();
}
});
}
}
@Override
public BaseViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
BaseViewHolder holder = null;
View view = null;
if (viewType == VIEW_PROG) {
view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_footer, parent, false);
} else {
view = LayoutInflater.from(parent.getContext()).inflate(getLayoutId(viewType), parent, false);
}
holder = new BaseViewHolder(view);
return holder;
}
@Override
public void onBindViewHolder(BaseViewHolder holder, int position) {
if (holder.getItemViewType() == BaseRecyPRAdapter.VIEW_PROG) {
// LogTool.LogE_DEBUG(TAG, "onBindViewHolder--->" + mState);
ProgressBar progressBar = (ProgressBar) holder.getView(R.id.progressbar);
TextView text = (TextView) holder.getView(R.id.text);
if (mState == STATE_LOAD_COMPLETE) {
progressBar.setVisibility(View.GONE);
text.setText(mContext.getString(R.string.没有数据了));
} else {
progressBar.setVisibility(View.VISIBLE);
text.setText(mContext.getString(R.string.正在加载中));
}
}
if (holder.getItemViewType() == BaseRecyPRAdapter.VIEW_ITEM) {
onBindData(holder, position);
}
}
@Override
public int getItemCount() {
if (isShowFootVieW) {
return mDataList == null ? 0 : mDataList.size() + 1;
} else {
return mDataList == null ? 0 : mDataList.size();
}
}
//根据不同的数据返回不同的viewType
@Override
public int getItemViewType(int position) {
if (mDataList == null)
return VIEW_ITEM;
if (position == mDataList.size()) {
return VIEW_PROG;
} else {
return VIEW_ITEM;
}
}
/**
* 根据type 返回不同的布局
*
* @param type
* @return
*/
public abstract int getLayoutId(int type);
public abstract void onBindData(BaseViewHolder holder, int position);
public static class BaseViewHolder extends RecyclerView.ViewHolder {
private Map<Integer, View> mViewMap;
public View view;
public BaseViewHolder(View itemView) {
super(itemView);
view = itemView;
mViewMap = new HashMap<>();
}
/**
* 获取设置的view
*
* @param id
* @return
*/
public View getView(int id) {
View view = mViewMap.get(id);
if (view == null) {
view = itemView.findViewById(id);
mViewMap.put(id, view);
}
return view;
}
}
public void stopLoadMore() {
mState = STATE_NORMAL;
notifyDataSetChanged();
}
public void loadComplete() {
mState = STATE_LOAD_COMPLETE;
notifyItemChanged(getItemCount()-1);
}
public void setData(List<T> datas) {
mDataList = datas;
}
private LoadMoreDataListener mLoadMoreDataListener;
public void setLoadMoreDataListener(LoadMoreDataListener mLoadMoreDataListener) {
this.mLoadMoreDataListener = mLoadMoreDataListener;
}
public interface LoadMoreDataListener {
void loadMoreData();
}
}
在activity中使用:
public class MainActivity extends AppCompatActivity {
private static final String TAG = "RecyActivity";
private RecyclerView mRecyclerView;
private List<String> list = new ArrayList<>();
private MyRecyViewAdapter mAdapter;
private Handler handler = new Handler();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
init();
}
private void init() {
initView();
initData();
initListener();
}
private void initView() {
mRecyclerView = (RecyclerView) findViewById(R.id.recyclerView);
//创建一个LinearLayoutManager对象
LinearLayoutManager linearLayoutManager = new LinearLayoutManager(
this, LinearLayoutManager.VERTICAL, false);
mRecyclerView.setLayoutManager(linearLayoutManager);
//创建adapter对象
mAdapter = new MyRecyViewAdapter(this, mRecyclerView);
mRecyclerView.setAdapter(mAdapter);
mAdapter.setData(list);//设置数据
}
//初始化数据
private void initData() {
for (int i = 0; i < 15; i++) {
list.add("DATA---------->" + i);
}
}
//初始化监听
private void initListener() {
//加载更多回调监听
mAdapter.setLoadMoreDataListener(new BaseRecyPRAdapter.LoadMoreDataListener() {
@Override
public void loadMoreData() {
//加入null值此时adapter会判断item的type
Log.e(TAG, "loadMoreData--->");
handler.postDelayed(new Runnable() {
@Override
public void run() {
if (list.size() < 30) {
for (int i = 0; i < 5; i++) {
list.add("LOAD MORE DATA---------->" + i);
}
mAdapter.stopLoadMore();
} else {
mAdapter.loadComplete();
}
}
}, 500);
}
});
}
class MyRecyViewAdapter extends BaseRecyPRAdapter<String> {
public MyRecyViewAdapter(Context context, RecyclerView recyclerView) {
super(context, recyclerView);
}
@Override
public int getLayoutId(int type) {
return R.layout.item_view;
}
@Override
public void onBindData(BaseViewHolder holder, int position) {
Log.e(TAG, "onBindData--->" + position);
if (mDataList == null || mDataList.isEmpty())
return;
TextView tv = (TextView) holder.getView(R.id.tv_name);
if (tv != null) {
tv.setText("DATA--------->" + position);
}
}
}
}
来源:http://blog.csdn.net/desireyaoo/article/details/77585079
0
投稿
猜你喜欢
- SpringBoot 动态修改Scheduled场景:可配置的 Scheduled 执行时间,正常的 Scheduled 是在项目启动的时候
- 本文实例讲述了C#实现DataSet内数据转化为Excel和Word文件的通用类。分享给大家供大家参考,具体如下:前不久因为项目的需要写的一
- Java 实现 Http Server,模拟前端接口调用前言: 最近看到一个很有意思的东西,手写简单的 Http Server,而且只需要使
- spring注入枚举类型作为参数//定义枚举类型public enum ReportType { MONTH,WE
- 概述ArrayList是基于数组实现的,是一个动态数组,其容量能自动增长,类似于C语言中的动态申请内存,动态增长内存。ArrayList不是
- C#开发,收到下位机串口数据(温度信息),可能是正数也可能是负数,如何转换?第一反应是想起书本上的理论,无符号数表示范围是多少到多少,有符号
- 一、引言Good Good Study,Day Day UpMP自带的条件构造器虽然很强大,有时候也避免不了写稍微复杂一点业务的sql,那么
- 本文实例为大家分享了java实现画图板功能的具体代码,供大家参考,具体内容如下一、介绍这个画图板主要实现的功能是画矩形(矩形使用的是一个函数
- 1使用背景在实际项目中其中一部分逻辑可能会因为调用了外部服务或者等待锁等情况下出现不可预料的异常,在这个时候我们可能需要对调用这部分逻辑进行
- 1、实体类package com.yl.bean;import java.io.Serializable;import java.util.
- 本文实例为大家分享了Android GestureDetector实现手势滑动的具体代码,供大家参考,具体内容如下目标效果: 程
- 部分情况下无法通过maven仓库直接下载需要的jar包,只能讲jar包下载至本地来使用,spring boot框架内通过maven加载第三方
- yield()介绍yield()的作用是让步。它能让当前线程由“运行状态”进入到“就绪状态”,从而让其它具有相同优先级的等待线程获取执行权;
- 前言微信群里的一个提问引发的这个问题,C#异步有多少种实现方式?首先想要知道C#异步有多少中实现方式,首先我们要知道.NET提供的执行异步操
- 背景:当我们有需求将HashMap转为Json格式的String时,切记不要使用HashMap的toString()方法,需要使用FastJ
- 首先微信公众号开发网页授权登录使用环境:开发工具:eclipse;服务器:tomcat8,开发语言:JAVA。我写的网页授权登录时用开发者模
- SpringMVC在接收集合请求参数时,需要在Controller方法的集合参数里前添加@RequestBody,而@RequestBody
- 关键字:spring容器加载完毕做一件事情(利用ContextRefreshedEvent事件)应用场景:很多时候我们想要在某个类加载完毕时
- MongoDBMongoDB作为一种NoSQL数据库产品,其实已经非常著名了。去年,由于MongoDB安全认证的薄弱,上万家公司中招。虽然是
- 将自然语言编写的测试用例转换为可执行的测试,可以大大降低需求与开发之间的沟通成本,这是BDD(行为驱动开发)希望达到的效果。SpecFlow