关于OkHttp解析数据添加到RecyclerView

来源:互联网 发布:电脑连不上网络 编辑:程序博客网 时间:2024/05/22 17:30
我们需要的依赖
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>



原创粉丝点击