RecycleView实现上拉加载更多

一.简介

因为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;
    }

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值