在google的android.support.v4包中,提供一个SwipeRefreshLayout方法, 用于实现下拉刷新,实现的过程也非常简单, 那我们先来看一下SwipeRefreshLayout是什么东西,其实从名字上来看,它就是一个刷新布局,我们来看它的继承结构图:
从上面的继承结构可以看出, 它继承于:ViewGroup. 而我们常见的LinearLayout, GridLayout等常见的布局,也是继承于ViewGroup。所以它的使用方法和我们常见的差不多,我们想要刷新下拉刷新我们的RecyclerView, 那我们就要将我们的RecyclerView布局文件放到SwipeLayout中。下面看具体过程和代码:1.首先在xml文件中将滑动的控件包裹在里面2.在fragment中找到该控件,然后设计一个监听,如果出现了一个手势下滑的动作,那么就下拉刷新。<?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>
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);//这个错误的,别看 }好了上拉也就写到这里,下次再来修改吧