关于OkHttp解析数据添加到RecyclerView

我们需要的依赖
compile 'com.squareup.okhttp3:okhttp:3.8.1'
compile 'com.github.bumptech.glide:glide:4.0.0-RC1'
compile 'com.google.code.gson:gson:2.8.1'
compile 'com.android.support:recyclerview-v7:24.2.1'
加完依赖,我们需要封装okhttp
/**
 * Created by YU on 2017/8/24.
 */

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);
                            }
                        }
                    });
                }
            });
        }
}
/
还有RecyclerView需要添加的封装类
/**
 * Created by YU on 2017/8/24.
 */

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);
        }
    }
}
/
当然还有基类1
public interface OnItemonclicklinear {
    void onClickListener(View v,int position);
}
/
这些做完我们就要在主方法里做接口的解析了
public class MainActivity extends AppCompatActivity {
    private List<Data.DataBean> list = new ArrayList<>();
    private int page = 1;
    private String url = "http://www.yulin520.com/a2a/impressApi/news/mergeList?sign=C7548DE604BCB8A17592EFB9006F9265&pageSize=20&gender=2&ts=1871746850&page=";
    private RecyclerView recyclerView;
    private SwipeRefreshLayout swipeRefreshLayout;
    private RecyclerAdapter adapter;
    private LinearLayoutManager linearLayoutManager;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initView();
        loadData();

    }

    //初始化数据
    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();

    }

    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();
                        }
                    }
                });
    }

    //设置适配器
    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();
            }
        });
    }

    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());
        图片用GIDE
	Gide.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);
        }
    }
}
///
然后bean就不多说了
主布局
<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>




  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值