okhttp请求json数据

布局文件:

<android.support.v4.widget.SwipeRefreshLayout
    android:id="@+id/swipe"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <android.support.v7.widget.RecyclerView
        android:id="@+id/recyclerview"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"></android.support.v7.widget.RecyclerView>
</android.support.v4.widget.SwipeRefreshLayout>

我们需要二次封装下okhttp请求:

public class OkHttpUtils {

        //声明OkHttpClient引用
        private OkHttpClient client;

        //私有化构造方法
        private OkHttpUtils(){
            //创建client对象只在创建OkHttpUitls对象时创建一次
            client = new OkHttpClient();
        }
        //声明静态OkHttpUtils引用
        private static OkHttpUtils utils;
        //单例设计模式让外部始终获得的是一个OkHttpUtils对象
        public static OkHttpUtils getInstance() {
            //双重判断加上同步锁可以解决线程安全问题
            if(utils==null){
                synchronized (OkHttpUtils.class){
                    if(utils==null){

                        //一旦判断没有创建过此类的对象就创建一次并返回
                        utils = new OkHttpUtils();

                        return utils;
                    }
                }
            }
            return utils;
        }
        //定义一个callback接口并定义范型(适用于任意类的返回对象)用于接口回调
        public interface CallBack<T>{
            //定义回调方法
            void getData(T t);
        }

        //创建万能的数据请求类,形参为四个activity对象,网址url,和得到数据的bean类为范型的class对象,实现接口的类对象
        public <T extends Object>void getBeanOfOk(final Activity activity, String url, final Class<T> clazz, final CallBack<T> callback){

            //创建request请求对象,设置其方式get,网址url
            Request request = new Request.Builder().get().url(url).build();

            //通过client的newCall方法传入request,并调用enqueue求求数据
            client.newCall(request).enqueue(new Callback() {
                @Override
                public void onFailure(Call call, IOException e) {
                }
                @Override
                public void onResponse(Call call, Response response) throws IOException {
                    //通过返回的response对象的body()和string()方法得到获取的json字符串
                    String json = response.body().string();
                    //通过Gson解析得到解析后任意类对象
                    final T t  = new Gson().fromJson(json,clazz);
                    //由于子线程中不能更新UI所以我们用activity对象调用方法回到主线程
                    activity.runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            if(t!=null){
                                //并用过接口回调传回数据
                                callback.getData(t);
                            }
                        }
                    });
                }
            });
        }
}
然后就是在MainActivity中调用它请求接口:
private void loadData() {

    //通过类名直接调用静态方法获取单例对象再调用getBeanOfOK()方法传入参数通过接口回调获取数据
    OkHttpUtils.getInstance().getBeanOfOk(this, url + page, Data.class,
            new OkHttpUtils.CallBack<Data>() {
                @Override
                public void getData(Data testBean) {

                    Log.i("===", "getData: " + testBean.toString());
                    if (testBean != null) {
                        //如果不为空用本地list接收
                        list.addAll(testBean.getData());
                        //数据一旦回调成功初始化数据源和适配器
                        initAdapter();
                    }
                }
            });
}
然后是在MainActivity中new适配器的方法:
//设置适配器
public void initAdapter() {
    adapter = new RecyclerAdapter(list, this);
    recyclerView.setAdapter(adapter);
    adapter.setOnItemonclicklinear(new OnItemonclicklinear() {
        @Override
        public void onClickListener(View v, int position) {
            Data.DataBean bean = list.get(position);
            Toast.makeText(MainActivity.this, bean.getUserName(), Toast.LENGTH_SHORT).show();
        }
    });
}
然后在MainActivity中设置上拉加载下拉刷新:
private void initData() {
    //上拉刷新
    swipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
        @Override
        public void onRefresh() {
            page ++;
            loadData();
            adapter.notifyDataSetChanged();
            swipeRefreshLayout.setRefreshing(false);
        }
    });
    //下拉加载
    recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
        @Override
        public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
            super.onScrollStateChanged(recyclerView, newState);
            int lastVisibleItemPosition = linearLayoutManager.findLastVisibleItemPosition();
            if (lastVisibleItemPosition==list.size()-1){
                page++;
                loadData();
                adapter.notifyDataSetChanged();
            }
        }
    });

}
然后是适配器:
public class RecyclerAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
    private List<Data.DataBean> list;
    private Context context;
    private OnItemonclicklinear onItemonclicklinear;

    public void setOnItemonclicklinear(OnItemonclicklinear onItemonclicklinear) {
        this.onItemonclicklinear = onItemonclicklinear;

    }

    public RecyclerAdapter(List<Data.DataBean> list, Context context) {
        this.list = list;
        this.context = context;
    }

    //加载布局。
    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = null;
        RecyclerView.ViewHolder viewHolder = null;
        view = LayoutInflater.from(context).inflate(R.layout.item, null);
        viewHolder = new myViewHolder(view);
        return viewHolder;
    }
    //赋值
    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, final int position) {
        Data.DataBean bean=list.get(position);
//        name, occupation, age, introduction;
        final myViewHolder myViewHolder= (myViewHolder) holder;
        myViewHolder.occupation.setText(bean.getOccupation());
        myViewHolder.age.setText(bean.getUserAge()+"岁");
        myViewHolder.introduction.setText(bean.getIntroduction());
        myViewHolder.name.setText(bean.getUserName());
        Glide.with(context).load(bean.getUserImg()).into(myViewHolder.imageView);
        //监听事件回调
        myViewHolder.itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                onItemonclicklinear.onClickListener(myViewHolder.itemView,position);
                ObjectAnimator animator=ObjectAnimator.ofFloat(myViewHolder.itemView,"alpha",0.0f,1.0f).setDuration(1000);
                animator.start();
            }
        });
    }

    @Override
    public int getItemCount() {
        return list != null ? list.size() : 0;
    }

    static class myViewHolder extends RecyclerView.ViewHolder {
        TextView name, occupation, age, introduction;
        ImageView imageView;

        public myViewHolder(View itemView) {
            super(itemView);
            name = (TextView) itemView.findViewById(R.id.name);
            age = (TextView) itemView.findViewById(R.id.age);
            occupation = (TextView) itemView.findViewById(R.id.occupation);
            introduction = (TextView) itemView.findViewById(R.id.introduction);
            imageView = (ImageView) itemView.findViewById(R.id.iamge);
        }
    }
}
在适配器里的OnItemonclicklinear需要创建一个类:
public interface OnItemonclicklinear {
    void onClickListener(View v,int position);
}
还有在MainActivity中初始化数据
//初始化数据
private void initView() {
    recyclerView = (RecyclerView) findViewById(R.id.recyclerview);
    swipeRefreshLayout = (SwipeRefreshLayout) findViewById(R.id.swipe);
    //线性布局管理及设置
    linearLayoutManager = new LinearLayoutManager(this);
    recyclerView.setLayoutManager(linearLayoutManager);
    recyclerView.addItemDecoration(new ItemDecration(this));
    initData();

}
初始化ItemDecration类
public class ItemDecration extends RecyclerView.ItemDecoration {
    private int with;
    private Context context;

    public ItemDecration(Context context) {
        this.context = context;
        DisplayMetrics displayMetrics = new DisplayMetrics();
        ((Activity) context).getWindow().getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);
        with = displayMetrics.widthPixels;
    }

    @Override
    public void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state) {
        super.onDraw(c, parent, state);
        Paint paint = new Paint();
        paint.setColor(Color.RED);
        int childCount = parent.getChildCount();
        for (int i = 0; i < childCount; i++) {
            View view = parent.getChildAt(i);
            int bottom=view.getBottom();
            c.drawLine(0,bottom,with,bottom,paint);
        }
    }
}

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值