SwipeRefreshLayout +RecycleView实现上拉加载更多和下拉刷新

主要就是在上拉到最后一条数据的时候显示footerview,然后数据获取成功的时候调用 adpter的数据刷新即可。

贴2张效果图:

1.上拉加载更多:
这里写图片描述

2.下拉刷新:
这里写图片描述
代码不难,而且都有注释,有问题互相学习啊,直接上代码
RecycleViewAdapter.java

public class RecycleViewAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {

    public static final int ITEM_TYPE = 0;
    public static final int FOOTER_TYPE = -1;//footview 即 加载更多
    private List<String> data = new ArrayList<>();
    private Context mContext;
    private LayoutInflater layoutInflater;
    private FooterView mFooterView;

    public RecycleViewAdapter(Context context, List<String> data, FooterView footerView){
        this.data = data;
        mContext = context;
        layoutInflater = LayoutInflater.from(context);
        mFooterView = footerView;
    }

    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

        if(viewType == ITEM_TYPE){
            View view = layoutInflater.inflate(R.layout.recycle_view_item, parent, false);
            ItemHolder itemHolder = new ItemHolder(view);
            return itemHolder;

        }else{
            return new SimpleViewHolder(mFooterView);
        }

    }

    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
        String datas ="" ;
        if(position < data.size()){
            datas = data.get(position);
        }

        if(holder instanceof ItemHolder){
            ((ItemHolder)holder).tv.setText(datas);
        }else{
            mFooterView.setVisibility(View.VISIBLE);
            Log.e("xxx", "footView");
        }
    }

    @Override
    public int getItemCount() {
        return data.size()+1;
    }

    public boolean isFooter(int position) {
        Log.e("xxx", "isFooter position = "+position+", getItemCount = "+getItemCount());
        return position < getItemCount() && position >= getItemCount() - 1;
    }

    @Override
    public int getItemViewType(int position) {
        if(isFooter(position)){
            return FOOTER_TYPE;
        }else{
            return ITEM_TYPE;
        }

    }


    class ItemHolder extends RecyclerView.ViewHolder{

        private TextView tv;

        public ItemHolder(View itemView) {
            super(itemView);
            tv = (TextView) itemView.findViewById(R.id.item_tv);
        }
    }

    class SimpleViewHolder extends RecyclerView.ViewHolder {

        public SimpleViewHolder(View itemView) {
            super(itemView);
        }
    }

}

FooterView代码如下:

public class FooterView extends LinearLayout {
    public FooterView(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
        init(context);
    }

    public FooterView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init(context);
    }

    public FooterView(Context context) {
        super(context);
        init(context);
    }

    private void init(Context context){
        LayoutInflater.from(context).inflate(R.layout.footer_view, this, true);
    }

}

其中的xml文件如下:

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

    <TextView
        android:layout_marginLeft="55dp"
        android:layout_width="wrap_content"
        android:layout_height="90px"
        android:textSize="20sp"
        android:text="正在加载中"
        android:gravity="center"/>

    <ProgressBar
        android:layout_marginTop="9dp"
        android:layout_marginLeft="15dp"
        android:layout_width="wrap_content"
        android:layout_height="70px"
        style="?android:attr/progressBarStyleSmall"
        />


</LinearLayout>

最后只Activity

public class RecycleViewActivity extends Activity  {

    private RecyclerView recyclerView;
    private List<String> mDatas = new ArrayList<>();
    private RecycleViewAdapter mRecycleViewAdapter;
    private FooterView mFooterView;
    private SwipeRefreshLayout swiperefresh;
    private boolean isLoading = false;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.recycleview_mian_layout);

        initData();
        recyclerView = (RecyclerView) findViewById(R.id.my_recycleview);
        swiperefresh = (SwipeRefreshLayout)findViewById(R.id.swiperefresh);

        //设置下拉刷新的loading圈的颜色
        swiperefresh.setColorSchemeResources(R.color.my_tv_color_category_drama, R.color.my_tv_color_category_drama, R.color.my_tv_color_category_drama,
                R.color.my_tv_color_category_drama);

        swiperefresh.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
            @Override
            public void onRefresh() {
                Log.e("xxx", "onRefresh");
                try {
                    Thread.sleep(2000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                swiperefresh.setRefreshing(false);//停止下拉刷新
            }
        });

        LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
        recyclerView.setLayoutManager(linearLayoutManager);
        linearLayoutManager.setOrientation(OrientationHelper.VERTICAL);
        recyclerView.setItemAnimator(new DefaultItemAnimator());

        mFooterView = new FooterView(this);
        mRecycleViewAdapter = new RecycleViewAdapter(this, mDatas, mFooterView);
        recyclerView.setAdapter(mRecycleViewAdapter);

        recyclerView.setOnScrollListener(new RecyclerView.OnScrollListener() {
            @Override
            public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
                int lastVisibleItemPosition = 0;
                //滑动手指且之前滑动的加载更多已经完成
                if (newState == RecyclerView.SCROLL_STATE_IDLE && !isLoading){
                    RecyclerView.LayoutManager layoutManager = recyclerView.getLayoutManager();
                    lastVisibleItemPosition = ((LinearLayoutManager) layoutManager).findLastVisibleItemPosition();
                    Log.e("xxx", "lastVisibleItemPosition = "+lastVisibleItemPosition+", ItemCount = "+layoutManager.getItemCount());
                    if(lastVisibleItemPosition >= layoutManager.getItemCount() -1){//到达最后一条数据是
//                        mFooterView.setVisibility(View.VISIBLE);
                        isLoading = true;
                        loadMoreData();
                    }
                }
            }
        });
    }

    private void loadMoreData() {
        List<String> data = new ArrayList<>();
        try {
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        for(int i = 0 ;i<6; i++){
            data.add("新增数据"+(i+1));
        }
        mDatas.addAll(data);
        mRecycleViewAdapter.notifyDataSetChanged();
        isLoading = false;
        mFooterView.setVisibility(View.GONE);

    }

    private void initData() {
        for(int i=0; i< 10; i++){
            mDatas.add("数据 "+(i+1));
        }
    }


}

RecycleViewActivity 相应的xml文件如下:

<?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:orientation="vertical">

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

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

        </android.support.v7.widget.RecyclerView>

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


</LinearLayout>

好了,代码都贴完了。有问题互相交流啊。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值