XRecyclerView的下拉刷新上拉加载功能

来源:互联网 发布:网络继续教育学院 编辑:程序博客网 时间:2024/05/22 06:35

以前一直是用的XListView   可是 测试发现有一个奇奇怪怪的BUG,我们还无法解决。最严重的是 XListView   里面用的添加头addHeaderView方法在17以前有概率崩溃。后来在同事的项目里看到PullToZoomListViewEx开源代码,实现的很好,但是代码太难懂,感觉扩展性不好。

最后在RecyclerView的强大功能下,还是觉得要用集成RecyclerView的下拉刷新上拉加载的控件才好。


好用集成RecyclerView下拉功能的控件都用到了SwipeRefreshLayout布局,使得下拉样式很官方,不满足产品大大的需求。(其实官方多好的)

后来找到了这款开源的控件XRecyclerView  git地址:https://github.com/jianghejie/XRecyclerView     可以看动画效果 

掩饰不住内心高兴的心情,下载下来,发现功能太强的了


但是也有很多不足的地方,不必 很多 选择刷新和加载的样式类。其实一般不需要

主要原理就是把重写的Adapter  把我们的mHeader和mFooter  (如果需要还有   headviews)重组到Adapter  里面。并且也重写了监听。

这个设计简直就是棒棒哒



import android.os.Bundle;import android.support.annotation.Nullable;import android.support.v4.app.Fragment;import android.support.v7.widget.LinearLayoutManager;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import com.bwie.test.yuekaomoni.utils.GsonObjectCallback;import com.bwie.test.yuekaomoni.utils.OkHttp3Utils;import com.jcodecraeer.xrecyclerview.XRecyclerView;import java.io.IOException;import java.util.ArrayList;import java.util.List;import okhttp3.Call;public class Fragment1 extends Fragment{    XRecyclerView recyclerView;    int pager=21;    private String path;    List<Beans.SongListBean> beas;    HomeAdapter homeAdapter;    @Nullable    @Override    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {        View view=inflater.inflate(R.layout.fragment_1,null);        recyclerView=view.findViewById(R.id.recycler);        beas=new ArrayList<>();        LinearLayoutManager layoutManager=new LinearLayoutManager(getActivity());        layoutManager.setOrientation(LinearLayoutManager.VERTICAL);        recyclerView.setLayoutManager(layoutManager);        recyclerView.setLoadingListener(new XRecyclerView.LoadingListener() {            @Override            public void onRefresh() {                pager=21;                getDate(pager,"");            }            @Override            public void onLoadMore() {                pager=pager+1;                getDate(pager,"load");            }        });        getDate(pager,"");        return view;    }    private void getDate(int pager, final String type)    {        path = "http://tingapi.ting.baidu.com/v1/restserver/ting?method=baidu.ting.billboard.billList&type=2&size="+pager+"&offset=0";        OkHttp3Utils.getInstance().doGet(path,new GsonObjectCallback<Beans>()        {            @Override            public void onUi(Beans beans) {                List<Beans.SongListBean> song_list = beans.getSong_list();                if (type.equals("load")){                    beas.addAll(song_list);                    homeAdapter.notifyDataSetChanged();                    recyclerView.loadMoreComplete();                }else{                    if (homeAdapter==null){                        beas=song_list;                        homeAdapter = new HomeAdapter(beas, getActivity());                        recyclerView.setAdapter(homeAdapter);                    }                    homeAdapter.notifyDataSetChanged();                    recyclerView.refreshComplete();                }            }            @Override            public void onFailed(Call call, IOException e) {            }        });    }}

这里了是添加数据的适配器。。。

import android.content.Context;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.os.AsyncTask;import android.support.v7.widget.RecyclerView;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.ImageView;import com.nostra13.universalimageloader.core.ImageLoader;import java.io.InputStream;import java.net.HttpURLConnection;import java.net.URL;import java.util.ArrayList;import java.util.List;public class HomeAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>{    public final int ONE=1;    public final int TWO=2;    List<Beans.SongListBean> songs;    Context context;    ArrayList mlist;    public HomeAdapter(List<Beans.SongListBean> songs,Context context) {        this.context = context;        this.songs = songs;    }    @Override    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {        View mview = null;        if (viewType == ONE) {            mview = LayoutInflater.from(context).inflate(R.layout.fragment_item, null);            ViewHolderA holder = new ViewHolderA(mview);            return holder;        }else {            mview = LayoutInflater.from(context).inflate(R.layout.fragment_er, null);            ViewHolderB holder = new ViewHolderB(mview);            return holder;        }    }    @Override    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {            if(holder instanceof ViewHolderA){                mlist=new ArrayList();                for(int i=0;i<songs.size();i++){                    mlist.add(songs.get(i).getPic_big());                }                //设置图片加载器                ((ViewHolderA) holder).banner.setImageLoader(new geLoader());                ((ViewHolderA) holder).banner.setImages(mlist);                ((ViewHolderA) holder).banner.start();            }else {                    ((ViewHolderB) holder).texts.setText(songs.get(position).getSi_proxycompany());                    /*Glide.with(context).load(songs.get(position).getPic_small()).into(((ViewHolderB) holder).img);*/                ImageLoader.getInstance().displayImage(songs.get(position).getPic_small(),((ViewHolderB) holder).img);               /* loadImage(((ViewHolderB) holder).img,songs.get(position).getPic_small(),10,10);*/            }    }    @Override    public int getItemCount() {        return songs.size();    }    @Override    public int getItemViewType(int position) {       if(position==0){           return ONE;       }else {           return TWO;       }    }    /*    img即你要获得图片的控件    path即你要从网络上获取的图片    destHight你要采样的图片高度    deWeight你要采样的图片宽度   */    private void loadImage(final ImageView img, String path, final int destHight, final int destWeight) {        new AsyncTask<String, Void, Bitmap>() {            @Override            protected void onPostExecute(Bitmap bitmap) {                super.onPostExecute(bitmap);                if (bitmap != null)                    img.setImageBitmap(bitmap);                else                    img.setImageResource(R.mipmap.ic_launcher);            }            @Override            protected Bitmap doInBackground(String... params) {                try {                    String path = params[0];                    URL url = new URL(path);                    HttpURLConnection connection = (HttpURLConnection) url.openConnection();                    connection.setRequestMethod("GET");                    connection.setConnectTimeout(5000);                    connection.setReadTimeout(5000);                    int code = connection.getResponseCode();                    if (code == 200) {                        //得到图片数据                        InputStream is = connection.getInputStream();                        //BitmapFactory.decodeStream(is);//ARGB_888 一个像素占 4个字节  ARGB_565 一个像素占 2 个字节  Alpha Red、Green、Blue(颜色)                        BitmapFactory.Options options = new BitmapFactory.Options();                        //在图片真正解析之前,不要解析图片数据,只需要告诉一下转换器,只要获取图片的像素(宽高)                        options.inJustDecodeBounds = true;//告诉BitmapFactory转换工厂不去真正解析图片只需要拿到图片宽高就行                        //假解析 API 有bug                        BitmapFactory.decodeStream(is, null, options);                        //压缩,根据图片采样率进行二次采样   100 * 100 是你所期望的具体图片尺寸                        //options.inSampleSize = 2; //采样用来计算图片的宽高(1920 * 1080 -> 1920 / 2 1080 / 2)                        //获取图片宽高,注意:图片的原始宽高                        int width = options.outWidth;                        int height = options.outHeight;                        System.out.println("宽:" + width + "高 : " + height);                        //定义一个变量去记住我们采样率                        int inSampleSize = 1;//默认是1 ,即不对图片进行任何压缩                        if (width > destWeight || height > destHight) {                            int halfWidth = width / 2;                            int halfHeight = height / 2;                            while ((halfWidth / inSampleSize) >= destWeight && (halfHeight / inSampleSize) >= destHight) {                                //计算采样率                                inSampleSize *= 2;                            }                        }                        //采样率改变了                        options.inSampleSize = inSampleSize;// 8                        //图片压缩完之后,放行图片解析                        options.inJustDecodeBounds = false;//告诉图片转换工厂,可以解析图片了                        //关闭之前的流                        is.close();                        //重新再去得到当前这张图片的字节流数据                        is = url.openStream();                        //开始解析图片                        Bitmap bitmap = BitmapFactory.decodeStream(is, null, options);                        //关闭流                        is.close();                        // Bitmap bitmap = BitmapFactory.decodeStream(is);                        return bitmap;                    }                } catch (Exception e) {                    e.printStackTrace();                }                return null;            }        }.execute(path);    }}