开发百宝箱

RecycleView上拉加载与下拉刷新

2018-08-07  本文已影响87人  digtal_
ezgif-1-9c2ffa8e96.gif

下拉刷新

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:layout_width="match_parent"
              android:layout_height="match_parent">

    <android.support.v4.widget.SwipeRefreshLayout
        android:id="@+id/refresh"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <android.support.v7.widget.RecyclerView
            android:id="@+id/rv"
            android:layout_width="match_parent"
            android:layout_height="match_parent">
        </android.support.v7.widget.RecyclerView>

    </android.support.v4.widget.SwipeRefreshLayout>
</LinearLayout>

在布局中用SwipeRefreshLayout包裹RecyclerView然后在代码中设置SwipeRefreshLayout的监听即可

      //设置下拉刷新
       mRefreshLayout.setOnRefreshListener(this);

上拉加载

上拉加载主要是通过LayoutManger来判断条目滑动的位置是否是在最后一个再来进行加载更多的操作

mRecyclerView.setOnScrollListener(new RecyclerView.OnScrollListener() {
            @Override
            public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
                int lastVisibleItemPosition = layoutManager.findLastVisibleItemPosition();
                //此时已经滑动到最后一个条目开始加载更多
                if (layoutManager.getItemCount() - 1 == lastVisibleItemPosition && newState ==             
                       RecyclerView.SCROLL_STATE_IDLE) {
                    LogUtils.LogE("加载更多1");
                }
            }

通过监听的回调方法就可以知道是否滑动到了最后一个条目
在Adapter中把加载更多的条目当作是脚布局放进去

 //普通条目
    private final int TYPE_NORMAL = 1;
    //加载更多条目
    private final int TYPE_LOAD_MORE = 2;

    //加载完成
    public static final int LOAD_COMPLETE = 3;
    //加载中
    public static final int LOADING = 4;
    //全部加载完成
    public static final int LOAD_END = 5;

    private int mCurrentState;

    private List<CartModel> mDatas;


    public MyAdapter(List<CartModel> list) {
        mDatas = list;
    }

    public void setCurrentState(int currentState) {
        mCurrentState = currentState;
        notifyDataSetChanged();
    }

    public void setData(List<CartModel> list) {
        mDatas = list;
        notifyDataSetChanged();
    }

    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view;
        RecyclerView.ViewHolder holder;
        if (viewType == TYPE_NORMAL) {
            view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_shopping_cart, parent, false);
            holder = new MyHolder(view);
        } else {
            view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_footer_load, parent, false);
            holder = new LoadmoreHolder(view);
        }

        return holder;
    }

    @Override
    public void onBindViewHolder(final RecyclerView.ViewHolder holder, final int position) {
        if (getItemViewType(position) == TYPE_NORMAL) {
            MyHolder myHolder = (MyHolder) holder;
            myHolder.setItem(position);
        } else {
            LoadmoreHolder loadmoreHolder = (LoadmoreHolder) holder;
            if (mCurrentState == LOADING) {//加载中
                loadmoreHolder.mLoading.setVisibility(View.VISIBLE);
                loadmoreHolder.mLoadEnd.setVisibility(View.GONE);
            } else if (mCurrentState == LOAD_COMPLETE) {//加载完成
                loadmoreHolder.mLoading.setVisibility(View.GONE);
                loadmoreHolder.mLoadEnd.setVisibility(View.GONE);
            } else if (mCurrentState == LOAD_END) {//全部加载完
                loadmoreHolder.mLoading.setVisibility(View.GONE);
                loadmoreHolder.mLoadEnd.setVisibility(View.VISIBLE);
            }
        }

    }

    @Override
    public int getItemViewType(int position) {

        if (position == getItemCount() - 1) {
            return TYPE_LOAD_MORE;
        } else {
            return TYPE_NORMAL;
        }

    }

    @Override
    public int getItemCount() {//加的一是脚步局
        return mDatas.size() + 1;
    }


    class MyHolder extends RecyclerView.ViewHolder {
        TextView title;
        ImageView imageViewAdd;
        ImageView imageViewReduce;
        TextView tvAmount;
        TextView tvOld;

        public MyHolder(View itemView) {
            super(itemView);
            title = itemView.findViewById(R.id.tv);
            imageViewAdd = itemView.findViewById(R.id.iv_add);
            imageViewReduce = itemView.findViewById(R.id.iv_reduce);
            tvAmount = itemView.findViewById(R.id.tvamount);
            tvOld = itemView.findViewById(R.id.tv_old);
            tvOld.getPaint().setFlags(Paint.STRIKE_THRU_TEXT_FLAG);

        }

        public void setItem(int position) {
            CartModel cartModel = mDatas.get(position);
            title.setText(cartModel.getName());
            tvAmount.setText(String.valueOf(cartModel.getCount()));

        }
    }

    class LoadmoreHolder extends RecyclerView.ViewHolder {
        LinearLayout mLoading;
        LinearLayout mLoadEnd;


        public LoadmoreHolder(View itemView) {
            super(itemView);
            mLoading = itemView.findViewById(R.id.ll_loadmore);
            mLoadEnd = itemView.findViewById(R.id.ll_nomore);
        }
    }

在Activity中来模拟请求数据,数据大于30个就表示全部加载完成

    private SwipeRefreshLayout mRefreshLayout;
    private RecyclerView mRecyclerView;
    private List<CartModel> mList;
    private MyAdapter mShoppingAdapter;
    private boolean mIsStart;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_loadmore);
        mRefreshLayout = findViewById(R.id.refresh);
        mRefreshLayout.setColorSchemeColors(Color.parseColor("#ff6600"));
        mRecyclerView = findViewById(R.id.rv);
        mList = new ArrayList<>();
        for (int i = 0; i < 10; i++) {
            CartModel cartModel = new CartModel();
            cartModel.setName("红烧牛肉面" + i);
            mList.add(cartModel);
        }
        mShoppingAdapter = new MyAdapter(mList);
        final LinearLayoutManager layoutManager = new LinearLayoutManager(this);
        mRecyclerView.setLayoutManager(layoutManager);
        mRecyclerView.addItemDecoration(new DividerItemDecoration(this, LinearLayoutManager.VERTICAL));
        mRecyclerView.setAdapter(mShoppingAdapter);

        //设置下拉刷新
        mRefreshLayout.setOnRefreshListener(this);
        //设置上拉加载更多
        mRecyclerView.setOnScrollListener(new RecyclerView.OnScrollListener() {
            @Override
            public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
                int lastVisibleItemPosition = layoutManager.findLastVisibleItemPosition();
                //此时已经滑动到最后一个条目开始加载更多
                if (layoutManager.getItemCount() - 1 == lastVisibleItemPosition && newState == RecyclerView.SCROLL_STATE_IDLE) {
                    LogUtils.LogE("加载更多1");
                    if (mList.size() >= 30) {
                        mShoppingAdapter.setCurrentState(MyAdapter.LOAD_END);
                    } else {
                        if (!mIsStart)
                            onloadMore();
                    }

                }
            }

            @Override
            public void onScrolled(RecyclerView recyclerView, int dx, int dy) {

            }
        });
    }

    private void onloadMore() {
        LogUtils.LogE("加载更多2");
        mIsStart = true;
        mShoppingAdapter.setCurrentState(MyAdapter.LOADING);
        new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {
                for (int i = 0; i < 10; i++) {
                    CartModel cartModel = new CartModel("上拉加载更多出来的" + i, 1);
                    mList.add(cartModel);
                }
                mShoppingAdapter.setCurrentState(MyAdapter.LOAD_COMPLETE);

                mShoppingAdapter.setData(mList);
                mIsStart = false;

            }
        }, 1500);
    }

    @Override
    public void onRefresh() {
        new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {
                CartModel cartModel = new CartModel("下拉刷新出来的数据", 1);
                mList.add(0, cartModel);
                mShoppingAdapter.setData(mList);
                mRefreshLayout.setRefreshing(false);
            }
        }, 1500);
    }
上一篇 下一篇

猜你喜欢

热点阅读