关于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()); 图片用GIDEGide.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 0
- 关于OkHttp解析数据添加到RecyclerView
- 网络请求数据添加到列表(okhttp+RecyclerView)
- okHttp解析到RecyclerView显示
- Okhttp解析Gson数据并且展示到recyclerView
- Okhttp解析Gson数据并且展示到recyclerView
- OkHttp解析数据,RecyclerView和Glide的加载图片
- RecyclerView的多条目展示,使用OkHttp解析数据
- OkHttp请求数据到RecyclerView多条目展示
- Android 添加数据到RecyclerView的顶部
- RecyclerView+OkHttp展示网络数据
- OkHttp+RecyclerView,利用OkHttp请求数据,并RecyclerView展示
- OkHttp的网络请求数据和RecyclerView的多条目加载,添加分割线
- OkHttp的网络请求数据和RecyclerView的多条目加载,添加分割线
- OKHTTP解析json数据
- An_MVP_模式(okhttp)解析RecyclerView/XRecyclerView
- OkHttp封装+RecyclerView显示网络请求数据
- OkHttp+RecyclerView多条目展示数据
- MVP模式OKhttp请求RecyclerView展示数据
- Java数据类型
- LeetCode:第三题
- Java中 VO、 PO、DO、DTO、 BO、 QO、DAO、POJO的概念
- C语言算法,八皇后问题,回溯算法
- 懒人实现Android城市列表
- 关于OkHttp解析数据添加到RecyclerView
- DS之单链表
- 1005. 继续(3n+1)猜想 (25)
- 简单的购物车...
- mysql注册驱动的三种方式
- Java变量
- MYSQL(五)
- 表单验证...
- Java运算符