项目中要实现上拉加载更多的功能,先看效果图:
图很渣…
咋实现的呢?
1.先给RecyclerView增加一个FooterView,Footerview就是加载中显示的内容,例如:加载中…等
2.判断是否滑动到最后一个Item,控制FooterView的显示和隐藏
1.Adapter中添加Footerview:
private static final int TYPE_ITEM_NORMAL = 0;
private static final int TYPE_ITEM_FOOTER = 1;
@Override
public int getItemViewType(int position) {
if(position + 1 < getItemCount()) return TYPE_ITEM_NORMAL;
else return TYPE_ITEM_FOOTER;
}
@Override
public int getItemCount() {
if(mData == null) return 0;
else return mData.size() + 1;//加一个footer view
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view;
if(viewType == TYPE_ITEM_NORMAL){
view = LayoutInflater.from(context).inflate(R.layout.item,parent,false);
return new ImageViewHolder(view);
}else{
view = LayoutInflater.from(context).inflate(R.layout.item_footer,parent,false);
return new FooterViewHolder(view);
}
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
if(holder instanceof FooterViewHolder){
FooterViewHolder footerViewHolder = (FooterViewHolder) holder;
if(mData.size() == MainActivity.allDataSize){
footerViewHolder.mLoadingImg.setVisibility(View.GONE);
footerViewHolder.mLoadingTips.setText("没有更多了");
}
}else{
ImageViewHolder imgViewHolder = (ImageViewHolder) holder;
final ImageData data = mData.get(position);
//获取item宽度,计算图片等比例缩放后的高度,为imageView设置参数
ViewGroup.LayoutParams layoutParams = imgViewHolder.imageView.getLayoutParams();
float itemWidth = (ScreenUtils.getScreenWidth(context) - 16*3) / 2;
layoutParams.width = (int) itemWidth;
float scale = (itemWidth+0f)/data.getWidth();
layoutParams.height= (int) (data.getHeight()*scale);
imgViewHolder.imageView.setLayoutParams(layoutParams);
Glide.with(context).
load(data.getResourceId()).
override(layoutParams.width, layoutParams.height).
into(imgViewHolder.imageView);
}
}
因为是瀑布流,要设置footerView占据一行
//用于StaggeredGridLayoutManager header footer 占据整行
@Override
public void onViewAttachedToWindow(RecyclerView.ViewHolder holder) {
super.onViewAttachedToWindow(holder);
ViewGroup.LayoutParams layoutParams = holder.itemView.getLayoutParams();
if (layoutParams != null && layoutParams instanceof StaggeredGridLayoutManager.LayoutParams) {
StaggeredGridLayoutManager.LayoutParams params = (StaggeredGridLayoutManager.LayoutParams) layoutParams;
int position = holder.getLayoutPosition();
if (getItemViewType(position) == TYPE_ITEM_FOOTER) {
params.setFullSpan(true);
}
}
}
2.MainActivity中给RecyclerView设置滑动监听
private void initRecyclerViewListener(){
mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
int lastVisiblePosition = 0;
int loadingState = 0;//0:没有加载
@Override
public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
super.onScrollStateChanged(recyclerView, newState);
//防止第一行到顶部有空白区域
layoutManager.invalidateSpanAssignments();
//加载更多
if(newState == RecyclerView.SCROLL_STATE_IDLE){//滑动停止
if(lastVisiblePosition + 1 == imageAdapter.getItemCount()){//滑动到最后一个item
if(mData.size() < allDataSize && loadingState == 0){
loadingState = 1;//加载中 避免多次滑动加载多次
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
int fromIndex,toIndex,addCount;
fromIndex = mData.size();
if(fromIndex + 10 < allDataSize) toIndex = fromIndex + 10;
else toIndex = allDataSize;
addCount = toIndex - fromIndex;
mData.addAll(mAllData.subList(fromIndex,toIndex));//每次加载10个数据
imageAdapter.notifyItemRangeInserted(fromIndex,addCount);
loadingState = 0;
}
},1000);// 模拟获取网络数据,延时1s
}
}
}
}
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
int positions[] = layoutManager.findLastVisibleItemPositions(null);
for(int pos : positions){
if(pos > lastVisiblePosition){
lastVisiblePosition = pos;//得到最后一个可见的item的position
}
}
}
});
}