RecyclerView+OkHttp的下拉刷新


依赖,权限

由于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;
    }
}




  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
RecyclerViewOkHttp 都是 Android 开发中非常常用的库。 RecyclerView 是 Android 官方在 API level 21 中推出的一个用于列表展示的组件,相比起 ListView,RecyclerView 的优点在于支持更加丰富的布局和动画,并且可以通过 ViewHolder 模式进行更高效的显示和数据更新。而且它也可以很好地与其他组件进行集成,比如 SwipeRefreshLayout、ItemTouchHelper 等等,为开发者提供了更丰富的选项。 而 OkHttp 则是一款非常流行的 HTTP 客户端库,它的优点在于简单易用,性能好且支持丰富的功能。通过 OkHttp,我们可以轻松地发起 HTTP 请求,并且可以直接将响应数据转化为常用的格式(比如 JSON)。同时,OkHttp 也支持网络拦截器、缓存、连接池、SSL、WebSocket 等特性,从而满足开发者在实际开发中的需求。 结合 RecyclerViewOkHttp,我们可以实现许多常见的需求。比如,我们可以通过 OkHttp 发起网络请求获取数据,并且通过 RecyclerView 将这些数据在列表中进行展示。我们也可以通过 OkHttp 实现图片的异步加载,并且使用 RecyclerView 实现图片列表的展示。当然,如果需要更加高级的功能,比如分页、筛选、搜索等,开发者也可以借助 OkHttpRecyclerView 的优势来实现这些功能。 综上所述,RecyclerViewOkHttp 都是非常好用的 Android 库,开发者在日常工作中都会频繁使用它们。当然,开发者也需要结合自身的实际情况,根据项目需求来选择合适的库,从而更快更好地进行开发。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值