Android-RecyclerView实现上拉加载更多及下拉刷新

实现了RecyclerView实现上拉加载更多及下拉刷新的功能

感谢  https://www.cnblogs.com/ryanleee/p/8204673.html

先看下效果

  

  

看下布局

activity_main.xml

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

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

item的布局 item_rv.xml 只有一个简单的TextView

item底部item_foot.xml

  <ImageView
        android:id="@+id/iv_foot"
        android:layout_width="50dp"
        android:layout_height="50dp"
        android:background="@drawable/icon"/>
    <TextView
        android:id="@+id/tv_foot"
        android:layout_toRightOf="@id/iv_foot"
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:gravity="center"/>

看下Activity,下拉刷新主要是通过 SwipeRefreshLayout嵌套RecyclerView,实现OnRefreshListener方法,再重新设置数据给Recyclerview达到刷新数据的目的,这里我通过模拟数据达到刷新的效果,注释都有写。上拉加载更多则是通过监听Recyclerview的滑动(OnScrollListener),当其滑动到底部时对其原有数据进行增加达到加载更多数据的目的。

  private RecyclerView recyclerView;
    private SwipeRefreshLayout swipeRefreshLayout;
    private List<String> mList;
    private RecyclerAdapter adapter;
    private int reTimes = 0;//更新次数

    @Override

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initView();
        getData();
        initRecyclerView();
    }

    private void initView() {
        recyclerView = findViewById(R.id.rv_home);
        swipeRefreshLayout = findViewById(R.id.sr_refresh);
        swipeRefreshLayout.setOnRefreshListener(this);
        mList = new ArrayList<>();
    }

    /**
     * 初始化RecyclerView
     */
    private void initRecyclerView() {
        adapter = new RecyclerAdapter(mList, this);
        recyclerView.setLayoutManager(new LinearLayoutManager(this));
        recyclerView.setItemAnimator(new DefaultItemAnimator());
        recyclerView.setAdapter(adapter);
        recyclerView.setOnScrollListener(new RecyclerView.OnScrollListener() {
            @Override
            public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
                super.onScrollStateChanged(recyclerView, newState);
                //滑动到底部
                if (newState == RecyclerView.SCROLL_STATE_IDLE) {
                    //recyclerview滑动到底部,更新数据
                    //加载更多数据
                    new Handler().postDelayed(new Runnable() {
                        @Override
                        public void run() {
                            if (reTimes < 2) {
                                getMoreData();
                                //告诉他有更多数据
                                adapter.hasMore(true);
                                adapter.notifyDataSetChanged();
                            } else {
                                //没有数据了
                                adapter.hasMore(false);
                                adapter.notifyDataSetChanged();
                            }
                        }
                    }, 3000);
                }
                else {//滑上去了
                    adapter.hasMore(true);
//                    adapter.notifyDataSetChanged();
                }
            }
        });

    }

    //刷新事件
    @Override
    public void onRefresh() {
        //显示刷新动画效果
        swipeRefreshLayout.setRefreshing(true);
        new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {
                //清空数据
                adapter.reData();
                //重新获取数据
                getData();
                //更新的数据
                upData();
                //重新设置有更多数据
                adapter.hasMore(true);
                reTimes = 0;
                adapter.notifyDataSetChanged();
                //隐藏刷新效果
                swipeRefreshLayout.setRefreshing(false);
            }
        }, 3000);
    }

    //获取数据
    public void getData() {
        for (int i = 0; i < 20; i++) {
            mList.add(i + "");
        }
    }

    //加载更多数据
    public void getMoreData() {
        reTimes++;
        List<String> moreList = new ArrayList<>();
        for (int i = 0; i < 10; i++) {
            moreList.add("加载的数据" + i);
        }
        mList.addAll(moreList);
    }

    //更新数据
    private void upData() {
        for (int i = 0; i < 5; i++) {
            mList.add(0, "更新的数据" + i);
        }
    }

设配器,Recyclerview的item有2种,一种是正常的Item,另一种则是底部加载更多的Item(Foot),我们通过getItemViewType来判断返回的是哪种Item。

    private List<String> mDatas;//数据
    private int TYPE_ITEM = 0;//正常的Item
    private int TYPE_FOOT = 1;//尾部刷新

    private Context mContext;

    private boolean hasMore = true;

    public RecyclerAdapter(List<String> mDatas, Context mContext) {
        this.mDatas = mDatas;
        this.mContext = mContext;
    }

    //返回不同布局
    @Override
    public int getItemViewType(int position) {
        if (position == getItemCount() - 1) {
            return TYPE_FOOT;
        }
        return TYPE_ITEM;
    }

    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        if (viewType == TYPE_ITEM) {
            return new ItemHolder(LayoutInflater.from(mContext).inflate(R.layout.item_rv, parent, false));
        } else {
            return new FootHolder(LayoutInflater.from(mContext).inflate(R.layout.item_foot, parent, false));
        }
    }

    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
        if (holder instanceof ItemHolder) {
            ((ItemHolder) holder).tv_item.setText("测试" + mDatas.get(position));
        } else {
            if (hasMore){
                ((FootHolder) holder).tv_foot.setText("正在加载更多。。");
                ((FootHolder) holder).iv_foot.setVisibility(View.VISIBLE);
            }else {
                ((FootHolder) holder).tv_foot.setText("没有更多数据。。");
                ((FootHolder) holder).iv_foot.setVisibility(View.GONE);
            }
        }
    }

    //多出尾部刷新的item
    @Override
    public int getItemCount() {
        return mDatas.size() + 1;
    }

    //item的holder
    class ItemHolder extends RecyclerView.ViewHolder {
        private TextView tv_item;

        public ItemHolder(View itemView) {
            super(itemView);
            tv_item = itemView.findViewById(R.id.tv_item);
        }
    }

    class FootHolder extends RecyclerView.ViewHolder {
        private TextView tv_foot;
        private ImageView iv_foot;

        public FootHolder(View itemView) {
            super(itemView);
            tv_foot = itemView.findViewById(R.id.tv_foot);
            iv_foot = itemView.findViewById(R.id.iv_foot);
        }
    }

    //是否有更多数据
    public void hasMore(boolean hamore) {
        this.hasMore = hamore;
    }

    //这里清空数据,避免下拉刷新后,还显示上拉加载的数据
    public void reData(){
        mDatas.clear();
    }
总体实现起来还是比较简单的,第一次写博客,有什么写的不好的地方请各位大神指教,谢谢!


  • 5
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值