RecyclerView+OkHttp的下拉刷新

来源:互联网 发布:北京南站离北京站源码 编辑:程序博客网 时间:2024/05/17 08:11


依赖,权限

由于XRecycleView是v7的所以在使用该方法的时候我们必须导入依赖

compile 'com.jcodecraeer:xrecyclerview:1.3.2'

当然如果你需求里没有刷新的话,我们可以导入

compile 'com.android.support:recyclerview-v7:26.0.0-alpha1'

网络请求OkHttp

compile 'com.squareup.okhttp3:okhttp:3.8.1'

因为是网络请求还得导入Gson解析的依赖

compile 'com.google.code.gson:gson:2.8.1'

glide的权限

compile 'com.github.bumptech.glide:glide:4.0.0'

在清单文件配置网络请求的权限

<uses-permission android:name="android.permission.INTERNET"></uses-permission><uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"></uses-permission><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission><uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission>

布局

activity_main.xml里面

<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:app="http://schemas.android.com/apk/res-auto"    xmlns:tools="http://schemas.android.com/tools"    android:layout_width="match_parent"    android:layout_height="match_parent"    tools:context="com.example.administrator.pangxiaoxu20170814.MainActivity">    <com.jcodecraeer.xrecyclerview.XRecyclerView        android:id="@+id/recycler"        android:layout_width="match_parent"        android:layout_height="match_parent"/></RelativeLayout>


item布局

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:orientation="vertical" android:layout_width="match_parent"    android:layout_height="match_parent">    <ImageView        android:id="@+id/image"        android:layout_width="wrap_content"        android:layout_height="wrap_content" /></LinearLayout>

和listview一样的一个简单的布局

下面是代码

OkHttp网络请求

public class OkHttpUtils {    private Handler hand = new Handler();    private NetDataCallback netDataCallback;    public <T> void getdata(String url, final NetDataCallback netDataCallback, final Class<T> tclass) {        //初始化一个 OkHttpClient 并且设置连接和读取超时时间        OkHttpClient okhttp = new OkHttpClient.Builder()                .connectTimeout(10, TimeUnit.SECONDS)                .readTimeout(20, TimeUnit.SECONDS)                .build();        //构造一个Request对象        Request request = new Request.Builder().url(url).build();        //通过request的对象去构造得到一个Call对象        Call call = okhttp.newCall(request);        //调用的是call.enqueue,将call加入调度队列,然后等待任务执行完成,我们在Callback中即可得到结果。        call.enqueue(new Callback() {            //失败的情况            @Override            public void onFailure(Call call, IOException e) {                Log.e("///////", "onFailure");                netDataCallback.fail(499, e.getMessage());            }            //成功的情况            @Override            public void onResponse(Call call, Response response) throws IOException {                Gson gson = new Gson();                T t = gson.fromJson(response.body().string(), tclass);                final Message msg = Message.obtain();                msg.what = ok;                msg.obj = t;                hand.post(new Runnable() {                    @Override                    public void run() {                        netDataCallback.success(msg.obj);                    }                });            }        });    }    //post请求    public <T> void getLoadDataPost(String url, final NetDataCallback netDataCallback, final Class<T> tClass, RequestBody body) {        this.netDataCallback = netDataCallback;        OkHttpClient okHttpClient = new OkHttpClient.Builder()                .readTimeout(20, TimeUnit.SECONDS)                .connectTimeout(10, TimeUnit.SECONDS)                .build();        final Request request = new Request.Builder().url(url).post(body).build();        Call call = okHttpClient.newCall(request);        call.enqueue(new Callback() {            @Override            public void onFailure(Call call, IOException e) {                netDataCallback.fail(499, e.getMessage());            }            @Override            public void onResponse(Call call, Response response) throws IOException {                T t = new Gson().fromJson(response.body().string(), tClass);                final Message msg = Message.obtain();                msg.what = OK;                msg.obj = t;                hand.post(new Runnable() {                    @Override                    public void run() {                        netDataCallback.success(msg.obj);                    }                });            }        });    }}


定义了一个接口类


public interface NetDataCallback<T> {    void success(T t);    void fail(int code, String str);}



下面是一个动画类

public class SpacesItemDecoration extends XRecyclerView.ItemDecoration {    private int space;    public SpacesItemDecoration(int space) {        this.space = space;    }    @Override    public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {        outRect.left = space;        outRect.right = space;        outRect.bottom = space;        if (parent.getChildAdapterPosition(view) == 0) {            outRect.top = space;        }    }}



这是封装的Bean类

public class Bean {    private List<美女Bean> 美女;    public List<美女Bean> get美女() {        return 美女;    }    public void set美女(List<美女Bean> 美女) {        this.美女 = 美女;    }    public static class 美女Bean {        /**         * adtype : 0         * boardid : comment_bbs         * clkNum : 0         * danmu : 1         * digest : 摘自微博 不知道是哪位美女         * docid : CQ91TK0R9001TK0S         * downTimes : 85         * img : http://dmr.nosdn.127.net/NWzVIyhX2e64vzeGubrARA==/6896093023037637938.jpg         * imgType : 0         * imgsrc : http://dmr.nosdn.127.net/NWzVIyhX2e64vzeGubrARA==/6896093023037637938.jpg         * imgsum : 0         * picCount : 0         * pixel : 700*873         * program : HY         * prompt : 成功为您推荐20条新内容         * rank : 0         * recNews : 0         * recType : 0         * refreshPrompt : 0         * replyCount : 8         * replyid : CQ91TK0R9001TK0S         * source : 堆糖网         * title : 摘自微博 不知道是哪位美女         * upTimes : 269         */        private int adtype;        private String boardid;        private int clkNum;        private int danmu;        private String digest;        private String docid;        private int downTimes;        private String img;        private int imgType;        private String imgsrc;        private int imgsum;        private int picCount;        private String pixel;        private String program;        private String prompt;        private int rank;        private int recNews;        private int recType;        private int refreshPrompt;        private int replyCount;        private String replyid;        private String source;        private String title;        private int upTimes;        public int getAdtype() {            return adtype;        }        public void setAdtype(int adtype) {            this.adtype = adtype;        }        public String getBoardid() {            return boardid;        }        public void setBoardid(String boardid) {            this.boardid = boardid;        }        public int getClkNum() {            return clkNum;        }        public void setClkNum(int clkNum) {            this.clkNum = clkNum;        }        public int getDanmu() {            return danmu;        }        public void setDanmu(int danmu) {            this.danmu = danmu;        }        public String getDigest() {            return digest;        }        public void setDigest(String digest) {            this.digest = digest;        }        public String getDocid() {            return docid;        }        public void setDocid(String docid) {            this.docid = docid;        }        public int getDownTimes() {            return downTimes;        }        public void setDownTimes(int downTimes) {            this.downTimes = downTimes;        }        public String getImg() {            return img;        }        public void setImg(String img) {            this.img = img;        }        public int getImgType() {            return imgType;        }        public void setImgType(int imgType) {            this.imgType = imgType;        }        public String getImgsrc() {            return imgsrc;        }        public void setImgsrc(String imgsrc) {            this.imgsrc = imgsrc;        }        public int getImgsum() {            return imgsum;        }        public void setImgsum(int imgsum) {            this.imgsum = imgsum;        }        public int getPicCount() {            return picCount;        }        public void setPicCount(int picCount) {            this.picCount = picCount;        }        public String getPixel() {            return pixel;        }        public void setPixel(String pixel) {            this.pixel = pixel;        }        public String getProgram() {            return program;        }        public void setProgram(String program) {            this.program = program;        }        public String getPrompt() {            return prompt;        }        public void setPrompt(String prompt) {            this.prompt = prompt;        }        public int getRank() {            return rank;        }        public void setRank(int rank) {            this.rank = rank;        }        public int getRecNews() {            return recNews;        }        public void setRecNews(int recNews) {            this.recNews = recNews;        }        public int getRecType() {            return recType;        }        public void setRecType(int recType) {            this.recType = recType;        }        public int getRefreshPrompt() {            return refreshPrompt;        }        public void setRefreshPrompt(int refreshPrompt) {            this.refreshPrompt = refreshPrompt;        }        public int getReplyCount() {            return replyCount;        }        public void setReplyCount(int replyCount) {            this.replyCount = replyCount;        }        public String getReplyid() {            return replyid;        }        public void setReplyid(String replyid) {            this.replyid = replyid;        }        public String getSource() {            return source;        }        public void setSource(String source) {            this.source = source;        }        public String getTitle() {            return title;        }        public void setTitle(String title) {            this.title = title;        }        public int getUpTimes() {            return upTimes;        }        public void setUpTimes(int upTimes) {            this.upTimes = upTimes;        }    }


下面是MainActivity

public class MainActivity extends AppCompatActivity implements NetDataCallback<Bean> {    private XRecyclerView mrv;    private RecyclerActivity md;    private ArrayList<Bean.美女Bean> mlist = new ArrayList<>();    private OkHttpUtils http;    private String url = "http://c.3g.163.com/recommend/getChanListNews?channel=T1456112189138&size=20&passport=&devId=1uuFYbybIU2oqSRGyFrjCw%3D%3D&lat=%2F%2FOm%2B%2F8ScD%2B9fX1D8bxYWg%3D%3D&lon=LY2l8sFCNzaGzqWEPPgmUw%3D%3D&version=9.0&net=wifi&ts=1464769308&sign=bOVsnQQ6gJamli6%2BfINh6fC%2Fi9ydsM5XXPKOGRto5G948ErR02zJ6%2FKXOnxX046I&encryption=1&canal=meizu_store2014_news&mac=sSduRYcChdp%2BBL1a9Xa%2F9TC0ruPUyXM4Jwce4E9oM30%3D";    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        if (isNetworkAvailable(this)) {            //有网的情况            Toast.makeText(MainActivity.this, "网络加载中....", Toast.LENGTH_SHORT).show();            mrv = (XRecyclerView) findViewById(R.id.recycler);            //设置间隔            SpacesItemDecoration decoration = new SpacesItemDecoration(16);            mrv.addItemDecoration(decoration);            //加载网络数据            loaddata();            md = new RecyclerActivity(this, mlist);            mrv.setLayoutManager(new StaggeredGridLayoutManager(2, StaggeredGridLayoutManager.VERTICAL));            mrv.setAdapter(md);            //属性动画渐变            ObjectAnimator animation = ObjectAnimator.ofFloat(mrv, "rotation", 0, 360);            animation.setDuration(5000);            animation.start();            //item条目的点击事件            md.setOnItemClickListener(new RecyclerActivity.OnItemClickListener() {                @Override                public void onItemClick(View view, int postion) {                    Toast.makeText(MainActivity.this, mlist.get(postion - 1).getDigest(), Toast.LENGTH_SHORT).show();                }            });            //加载更多的点击事件            mrv.setLoadingListener(new XRecyclerView.LoadingListener() {                @Override                public void onRefresh() {                    //刷新的方法                    mlist.clear();                    loaddata();                    mrv.refreshComplete();                }                @Override                public void onLoadMore() {                    //加载更多的方法                    loaddata();                    mrv.loadMoreComplete();                }            });        } else {            //没网的情况,提示去手动开启网络            Toast.makeText(MainActivity.this, "网络不可用", Toast.LENGTH_SHORT).show();            AlertDialog.Builder builder = new AlertDialog.Builder(this)                    .setTitle("提示")                    .setMessage("当前网络不可用,是否去设置网络")                    .setPositiveButton("确定", new DialogInterface.OnClickListener() {                        @Override                        public void onClick(DialogInterface dialog, int which) {                            Intent intent = new Intent("android.settings.WIFI_SETTINGS");                            startActivity(intent);                        }                    })                    .setNegativeButton("取消", new DialogInterface.OnClickListener() {                        @Override                        public void onClick(DialogInterface dialog, int which) {                            dialog.dismiss();                            finish();                        }                    });            builder.create().show();        }    }    private void loaddata() {        http = new OkHttpUtils();        http.getdata(url, (NetDataCallback) this, Bean.class);    }    //请求成功的方法    @Override    public void success(Bean news) {        Log.e("News的数据", news.toString());        mlist = (ArrayList<Bean.美女Bean>) news.get美女();        md.setdata(mlist);        md.notifyDataSetChanged();    }    @Override    public void fail(int code, String str) {    }    //判断有无网络的方法    public static boolean isNetworkAvailable(Context context) {        ConnectivityManager connectivity = (ConnectivityManager) context                .getSystemService(Context.CONNECTIVITY_SERVICE);        if (connectivity != null) {            NetworkInfo info = connectivity.getActiveNetworkInfo();            if (info != null && info.isConnected()) {                // 当前网络是连接的                if (info.getState() == NetworkInfo.State.CONNECTED) {                    // 当前所连接的网络可用                    return true;                }            }        }        return false;    }}



最后是RexyxleView的适配器
public class RecyclerActivity extends RecyclerView.Adapter {   ;    private View view;    private Context mcontext;    private ArrayList<Bean.美女Bean> mlist = new ArrayList<>();    private OnItemClickListener mClickListener;    public RecyclerActivity(Context mcontext, ArrayList<Bean.美女Bean> list) {        this.mcontext = mcontext;        this.mlist = list;    }    //找到需要导入的布局    @Override    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {        view = LayoutInflater.from(mcontext).inflate(R.layout.item, null);        return new ViewHolder(view, mClickListener);    }    //加载相应的内容    @Override    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {        ViewHolder viewholder = (ViewHolder) holder;        Glide.with(mcontext).load(getItem(position).getImgsrc()).into(viewholder.ima);    }    //手写的重置数据的方法    public void setdata(ArrayList<Bean.美女Bean> list) {        if (list != null && list.size() > 0) {            mlist.addAll(list);        }    }    //手写的获得视图的方法    public Bean.美女Bean getItem(int position) {        return mlist.get(position);    }    @Override    public int getItemCount() {        return mlist.size();    }    //定义的ViewHolder类继承RecyclerView.ViewHolder 并找到布局中的ID    public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {        private OnItemClickListener mListener;// 声明自定义的接口        private ImageView ima;        public ViewHolder(View itemView, OnItemClickListener listener) {            super(itemView);            mListener = listener;            //给item设置点击事件            itemView.setOnClickListener(this);            ima = (ImageView) itemView.findViewById(R.id.image);        }        @Override        public void onClick(View v) {            // getpostion()为Viewholder自带的一个方法,用来获取RecyclerView当前的位置,将此作为参数,传出去            mListener.onItemClick(v, getPosition());        }    }    //手写的一个接口    public interface OnItemClickListener {        public void onItemClick(View view, int postion);    }    //自定义的方法    public void setOnItemClickListener(OnItemClickListener listener) {        this.mClickListener = listener;    }}




原创粉丝点击