Android RecyclerView瀑布流 上拉加载更多

项目中要实现上拉加载更多的功能,先看效果图:

在这里插入图片描述

图很渣…
咋实现的呢?

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
                }
            }
        }
    });
}
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值