RecycleView添加下拉刷新、上拉加载更多

    在google的android.support.v4包中,提供一个SwipeRefreshLayout方法, 用于实现下拉刷新,实现的过程也非常简单, 那我们先来看一下SwipeRefreshLayout是什么东西,其实从名字上来看,它就是一个刷新布局,我们来看它的继承结构图:
 
 
从上面的继承结构可以看出, 它继承于:ViewGroup. 而我们常见的LinearLayout, GridLayout等常见的布局,也是继承于ViewGroup。所以它的使用方法和我们常见的差不多,我们想要刷新下拉刷新我们的RecyclerView, 那我们就要将我们的RecyclerView布局文件放到SwipeLayout中。
下面看具体过程和代码:
1.首先在xml文件中将滑动的控件包裹在里面
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent"

    >


    <TextView
        android:id="@+id/Retorytext4"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="" />
    
    <android.support.v4.widget.SwipeRefreshLayout
        android:id="@+id/swipe"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        >
    <android.support.v7.widget.RecyclerView
        android:id="@+id/Retorylistview"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
    </android.support.v4.widget.SwipeRefreshLayout>
</LinearLayout>
2.在fragment中找到该控件,然后设计一个监听,如果出现了一个手势下滑的动作,那么就下拉刷新。
swipe=view.findViewById(R.id.swipe);
//设置下拉颜色
swipe.setColorSchemeResources(R.color.colorAccent, R.color.colorPrimary, R.color.colorPrimaryDark);
swipe.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() { @Override public void onRefresh() {
        //打开动画
        swipe.setRefreshing(true);
         //请求网络,然后重新设置数据
        query();
    }
});
//这个是设置数据 
  rec.setdata(list1);
//这个是设置完数据就是关闭动画
  swipe.setRefreshing(false);

//这个网络请求的代码
 private void query()
    {
//        http://route.showapi.com/213-4?showapi_appid=48962&topid=5&showapi_sign=9ad486a2461e47f4b3391171911f5b4b
        //1.创建Retrofit对象
        Retrofit retrofit = new Retrofit.Builder()
                .addConverterFactory(GsonConverterFactory.create())//解析方法
                .baseUrl("http://route.showapi.com/")//主机地址
                .build();
        PlayerActivity.retrofitinter retrofitinter=retrofit.create(PlayerActivity.retrofitinter.class);
        Call<josntop> call=retrofitinter.getResult("48962","5","9ad486a2461e47f4b3391171911f5b4b");
        call.enqueue(new Callback<josntop>() {
                @Override
            public void onResponse(Call<josntop> call, Response<josntop> response)
            {


                list1= (ArrayList<josntop.ShowapiResBodyBean.PagebeanBean.SonglistBean>) response.body().getShowapi_res_body().getPagebean().getSonglist();
                TextView TV=view.findViewById(R.id.Retorytext4);

                    final Context context=view.getContext();
                    mrycleview=view.findViewById(R.id.Retorylistview);
                    RecyclerView.LayoutManager line= new LinearLayoutManager(context);

                    mrycleview.setLayoutManager(line);

                    rec.setdata(list1);
                       swipe.setRefreshing(false);

            }

            @Override
            public void onFailure(Call<josntop> call, Throwable t) {
                swipe.setRefreshing(false);
            }
        });
    }



    public interface retrofitinter
    {
        @GET("/213-4/")
        Call<josntop> getResult(@Query("showapi_appid") String showapi_appid, @Query("topid") String topid, @Query("showapi_sign") String showapi_sign);

    }
前面就是下拉刷新的代码,很简单把,就是设置一下布局,在弄个监听,在设置几个属性,然后刷新的时候打开动画,请求网络,加载设置数据,关闭动画就行了。下面介绍下上拉加载,上拉加载就不能这样写了,现在如何实现呢?这个时候只能靠RecyclerView了。
1.首先定义了一个抽象类来继承这个接口RecyclerView.OnScrollListener,这样就可以对这个接口进行数据的丰富,封装大量的方法,

abstract class EndLessOnScrollListener extends RecyclerView.OnScrollListener {

    //声明一个LinearLayoutManager
    private LinearLayoutManager mLinearLayoutManager;

    //当前页,从0开始
    private int currentPage = 0;

    //已经加载出来的Item的数量
    private int totalItemCount;

    //主要用来存储上一个totalItemCount
    private int previousTotal = 0;

    //在屏幕上可见的item数量
    private int visibleItemCount;

    //在屏幕可见的Item中的第一个
    private int firstVisibleItem;

    //是否正在上拉数据
    private boolean loading = true;

    public EndLessOnScrollListener(LinearLayoutManager linearLayoutManager) {
        this.mLinearLayoutManager = linearLayoutManager;
    }

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

        visibleItemCount = recyclerView.getChildCount();
        totalItemCount = mLinearLayoutManager.getItemCount();
        Log.e("msg",totalItemCount+"totalItemCount");
        firstVisibleItem = mLinearLayoutManager.findFirstVisibleItemPosition();
        Log.e("msg",firstVisibleItem+"firstVisibleItem");
        if(loading){
            if(totalItemCount > previousTotal){
                //说明数据已经加载结束
                loading = false;
                previousTotal = totalItemCount;
            }
        }
        //这里需要好好理解
        if (!loading && totalItemCount-visibleItemCount <= firstVisibleItem){
            currentPage ++;
            onLoadMore(currentPage);
            loading = true;
        }
    }

    /**
     * 提供一个抽象方法,在Activity中监听到这个EndLessOnScrollListener
     * 并且实现这个方法
     * */
    public abstract void onLoadMore(int currentPage);
}
2.监听器已经弄好了,接下来,我们就是在Activity中为RecyclerView添加这个监听器,实现抽象方法onLoadMore()这样就可以了。下面看主要代码:我把这部分代码放到了请求网络的里面

mrycleview.addOnScrollListener(new EndLessOnScrollListener(line) {
    @Override
    public void onLoadMore(int currentPage) {
        query();
       //当然由于我没有分页,加载数据,所以我就在
        loadMoreData(list1);
        

    }
});
3.上面的程序中loadMoreData()方法为:我让它重新加载了这个集合,这样重复加载,因为我没有做分页。
private void loadMoreData(ArrayList list) {
    for (int i =0; i < 10; i++){
        if(list !=null)
        {
            this.list1.addAll(list);
            rec.notifyDataSetChanged();

        }

    }
}
4.加载一个view做显示用,但还没搞明白,因为recycleview居然没有addFootview这个方法,参考的博客又是用适配添加的不懂了???
public void createLoadMoreView(View view) {
    View loadMoreView = LayoutInflater
            .from(view.getContext())
            .inflate(R.layout.refesh,mrycleview,false);
        mrycleview.addView(loadMoreView);//这个错误的,别看


}

好了上拉也就写到这里,下次再来修改吧
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值