一.简介
因为RecycleView相比ListView来说。没有动态加载头部和底部的方法。所以实现上拉加载需要寻找其他办法。
ListView 添加头部
public void addHeaderView(View v) {
addHeaderView(v, null, true);
}
ListView 添加底部
public void addFooterView(View v) {
addFooterView(v, null, true);
}
二.RecycleView实现上拉加载更多
1.实现思路
由于RecyclerView没有和ListView一样的 添加头部 和 添加底部的方法。所以实现上拉加载更多不能使用常规的添加FooterView的方式。那么怎么实现呢?可以设置不同的ItemType。在RecyclerView滚动时操作相关的操作。
2.代码
Activity
public class RecyclerViewFooterActivity extends AppCompatActivity {
private SwipeRefreshLayout mSwipeRefreshLayout;
private ScrollLinearLayoutManager mLinearLayoutManager;
private RecyclerView mRecyclerView;
private RecycleViewFooterAdapter mRecycleViewAdapter;
private List<RecyclerViewBean> mList;
private int mCount = 1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_recyclerview);
initView();
}
/**
* 初始化各种View
*/
private void initView() {
mSwipeRefreshLayout = findViewById(R.id.activity_recyclerview_srl);
initSwipeRefreshLayout();
mRecyclerView = findViewById(R.id.activity_recyclerview_recyclerView);
mList = getList();
//1.设置LinearLayoutManager ListView
mLinearLayoutManager = new ScrollLinearLayoutManager(this);
mRecyclerView.setLayoutManager(mLinearLayoutManager);
//2.设置固定大小
mRecyclerView.setHasFixedSize(true);
//3.设置Adapter
mRecycleViewAdapter = new RecycleViewFooterAdapter(this, mList);
mRecyclerView.setAdapter(mRecycleViewAdapter);
//4.设置RecyclerView滚动时间
setRecyclerViewScrollListener();
}
/**
* 初始化SwipeRefreshLayout
*/
private void initSwipeRefreshLayout() {
//设置进度View的组合颜色,在手指上下滑时使用第一个颜色,在刷新中,会一个个颜色进行切换
mSwipeRefreshLayout.setColorSchemeColors(Color.parseColor("#6200EE"), Color.parseColor("#3700B3"), Color.parseColor("#03DAC5"), Color.YELLOW, Color.BLUE);
//下拉刷新
mSwipeRefreshLayout.setOnRefreshListener(() -> {
//模拟6秒刷新时间
Handler handler = new Handler(Looper.getMainLooper());
handler.postDelayed(() -> {
RecyclerViewFooterActivity.this.runOnUiThread(() -> {
mRecycleViewAdapter.updateData(getUpdateList(mList));
});
mSwipeRefreshLayout.setRefreshing(false);//结束刷新
}, 6000);
});
}
/**
* RecyclerView滚动监听
*/
private void setRecyclerViewScrollListener() {
mRecyclerView.addOnScrollListener(new RecyclerOnScrollListener() {
@Override
public void onLoadMore() {
mRecycleViewAdapter.updateMoreStatus(LOAD_ING);//加载中
mLinearLayoutManager.setCanScrollVertically(false);//此时RecyclerView不可滚动
//模拟6秒刷新时间
Handler handler = new Handler(Looper.getMainLooper());
handler.postDelayed(() -> {
RecyclerViewFooterActivity.this.runOnUiThread(() -> {
mRecycleViewAdapter.updateData(getMoreList());
});
mRecycleViewAdapter.updateMoreStatus(LOAD_COMPLETE);//结束加载
mLinearLayoutManager.setCanScrollVertically(true);//此时RecyclerView可滚动
}, 3000);
}
});
}
/**
* 初始化 默认集合数据
*/
private List<RecyclerViewBean> getList() {
List<RecyclerViewBean> list = new ArrayList<>();
RecyclerViewBean listViewBean1 = new RecyclerViewBean();
listViewBean1.setAva("");
listViewBean1.setTitle("张三");
RecyclerViewBean listViewBean2 = new RecyclerViewBean();
listViewBean2.setAva("");
listViewBean2.setTitle("韦德");
RecyclerViewBean listViewBean3 = new RecyclerViewBean();
listViewBean3.setAva("");
listViewBean3.setTitle("保罗");
for (int i = 0; i < 10; i++) {
list.add(listViewBean1);
list.add(listViewBean2);
list.add(listViewBean3);
}
return list;
}
/**
* 初始化 加载更多集合数据
*/
private List<RecyclerViewBean> getMoreList() {
mCount++;
List<RecyclerViewBean> list = new ArrayList<>(getList());
RecyclerViewBean listViewBean1 = new RecyclerViewBean();
listViewBean1.setAva("");
listViewBean1.setTitle("张三_加载更多" + mCount);
RecyclerViewBean listViewBean2 = new RecyclerViewBean();
listViewBean2.setAva("");
listViewBean2.setTitle("韦德_加载更多" + mCount);
RecyclerViewBean listViewBean3 = new RecyclerViewBean();
listViewBean3.setAva("");
listViewBean3.setTitle("保罗_加载更多" + mCount);
for (int i = 0; i < 10; i++) {
list.add(listViewBean1);
list.add(listViewBean2);
list.add(listViewBean3);
}
return list;
}
/**
* 初始化 刷新集合数据
*/
private List<RecyclerViewBean> getUpdateList(List<RecyclerViewBean> list) {
List<RecyclerViewBean> resultList = new ArrayList<>();
for (RecyclerViewBean recyclerViewBean : list) {
if ("张三".equals(recyclerViewBean.getTitle())) {
recyclerViewBean.setTitle("张三_刷新");
}
resultList.add(recyclerViewBean);
}
return resultList;
}
}
Adapter
public class RecycleViewFooterAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
private List<RecyclerViewBean> mList;
private LayoutInflater mInflater;
// 普通布局
private final int DEFAULT_TYPE = 0;
//加载更多布局
private final int FOOTER_TYPE = 1;
//当前加载状态,默认为加载完成
private int mLoadState = 2;
// 正在加载
public final static int LOAD_ING = 1;
// 加载完成
public final static int LOAD_COMPLETE = 2;
// 加载到底
public final int LOAD_END = 3;
public RecycleViewFooterAdapter(Context context, List<RecyclerViewBean> list) {
mList = list;
mInflater = LayoutInflater.from(context);
}
@NonNull
@Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
if (DEFAULT_TYPE == viewType) {
View view = mInflater.inflate(R.layout.recyclerview_item, parent, false);
return new ViewHolder(view);
} else if (FOOTER_TYPE == viewType) {
View view = mInflater.inflate(R.layout.recyclerview_footer_item, parent, false);
return new FooterViewHolder(view);
}
return null;
}
@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
if (holder instanceof ViewHolder) {//普通View
((ViewHolder) holder).textView.setText(mList.get(position).getTitle());
} else if (holder instanceof FooterViewHolder) {//加载更多
FooterViewHolder footerViewHolder = (FooterViewHolder) holder;
switch (mLoadState) {
case LOAD_ING://正在加载
footerViewHolder.layout.setVisibility(View.VISIBLE);
footerViewHolder.progressBar.setVisibility(View.VISIBLE);
footerViewHolder.loadingTextView.setVisibility(View.VISIBLE);
footerViewHolder.loadedTextView.setVisibility(View.GONE);
break;
case LOAD_COMPLETE://加载完成
footerViewHolder.layout.setVisibility(View.GONE);
footerViewHolder.progressBar.setVisibility(View.GONE);
footerViewHolder.loadingTextView.setVisibility(View.GONE);
footerViewHolder.loadedTextView.setVisibility(View.GONE);
break;
case LOAD_END://加载到底
footerViewHolder.layout.setVisibility(View.VISIBLE);
footerViewHolder.progressBar.setVisibility(View.GONE);
footerViewHolder.loadingTextView.setVisibility(View.GONE);
footerViewHolder.loadedTextView.setVisibility(View.VISIBLE);
break;
default:
break;
}
}
}
@Override
public int getItemCount() {
return mList.size() + 1;
}
@Override
public int getItemViewType(int position) {
if (position == mList.size()) {//最后一个 是底部item
return FOOTER_TYPE;
} else {
return DEFAULT_TYPE;
}
}
/**
* ViewHolder类
*/
static class ViewHolder extends RecyclerView.ViewHolder {
private ImageView imageView;
private TextView textView;
public ViewHolder(View itemView) {
super(itemView);
imageView = itemView.findViewById(R.id.recyclerview_item_imageview);
textView = itemView.findViewById(R.id.recyclerview_item_textview);
}
}
/**
* ViewHolder类 加载更多
*/
static class FooterViewHolder extends RecyclerView.ViewHolder {
private RelativeLayout layout;
private ProgressBar progressBar;
private TextView loadingTextView;
private TextView loadedTextView;
public FooterViewHolder(View itemView) {
super(itemView);
layout = itemView.findViewById(R.id.recyclerview_footer_item_layout);
progressBar = itemView.findViewById(R.id.recyclerview_footer_item_pb);
loadingTextView = itemView.findViewById(R.id.recyclerview_footer_item_tv);
loadedTextView = itemView.findViewById(R.id.recyclerview_footer_item_tv1);
}
}
/**
* 刷新数据
*/
public void updateData(List<RecyclerViewBean> list) {
if (null == list || list.size() == 0) return;
mList = list;
notifyDataSetChanged();
}
/**
* 加载更多状态刷新
*/
public void updateMoreStatus(int loadState) {
mLoadState = loadState;
notifyDataSetChanged();
}
}
滚动监听
public abstract class RecyclerOnScrollListener extends RecyclerView.OnScrollListener {
/**
* 是否正在向上滑动
*/
private boolean isSlidingUpward = false;
@Override
public void onScrollStateChanged(@NonNull RecyclerView recyclerView, int newState) {
super.onScrollStateChanged(recyclerView, newState);
LinearLayoutManager manager = (LinearLayoutManager) recyclerView.getLayoutManager();
//SCROLL_STATE_IDLE:空闲状态
if (null != manager && newState == RecyclerView.SCROLL_STATE_IDLE) {
//获取最后一个完全显示的itemPosition
int lastItemPosition = manager.findLastCompletelyVisibleItemPosition();
int itemCount = manager.getItemCount();
// 判断是否滑动到了最后一个item,并且是向上滑动
if (lastItemPosition == (itemCount - 1) && isSlidingUpward) {
//加载更多
onLoadMore();
}
}
}
@Override
public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
// 大于0表示正在向上滑动,小于等于0表示停止或向下滑动
isSlidingUpward = dy > 0;
}
/**
* 加载更多回调
*/
public abstract void onLoadMore();
}
是否可滚动(加载中时不可滚动,加载完成后可以滚动)
public class ScrollLinearLayoutManager extends LinearLayoutManager {
private boolean mCanScrollVertically = true;//是否可以横向滚动 true可以
private boolean mCanScrollHorizontally = true;//是否可以纵向滚动 true可以
public ScrollLinearLayoutManager(Context context) {
super(context);
}
/**
* 是否横向滚动
*/
@Override
public boolean canScrollVertically() {
return mCanScrollVertically;
}
/**
* 是否纵向滚动
*/
@Override
public boolean canScrollHorizontally() {
return mCanScrollHorizontally;
}
/**
* 设置是否支持横向滚动
*/
public void setCanScrollVertically(boolean canScrollVertically) {
mCanScrollVertically = canScrollVertically;
}
/**
* 设置是否支持纵向滚动
*/
public void setCanScrollHorizontally(boolean canScrollHorizontally) {
mCanScrollHorizontally = canScrollHorizontally;
}
}