xUtils的全面解析和案例讲解(二)

在本篇博客当中,主要xUtils的功能去完全加载网络数据(json)数据,并且解析到recyclerview当中的过程。

网址为:http://www.qubaobei.com/ios/cf/dish_list.php?stage_id=1&limit=10&page=1

步骤和上一篇博文一样,本篇当中就不做更加详细的讲解了,主要从代码角度,逐层深入的理解。

但是因为是json数据,所以使用解析方式和上篇当中的xml数据有些不同,使用gson工具进行解析。

所以需要在当前的moudle当中带入gson包(导包过程和以往相同,不再详述)。

首先,绘制activity的布局:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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"
    android:orientation="vertical"
    tools:context="com.animee.day401.demo02.FoodActivity">
    <android.support.v7.widget.RecyclerView
        android:id="@+id/food_rv"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
    </android.support.v7.widget.RecyclerView>
</LinearLayout>
接下来,需要绘制每一个item所对应的布局:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:padding="20dp">
    <ImageView
        android:id="@+id/item_food_iv"
        android:layout_width="120dp"
        android:layout_height="120dp"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true"
        android:layout_alignParentTop="true"
        android:scaleType="centerCrop" />
    <TextView
        android:id="@+id/item_food_name"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:layout_marginLeft="10dp"
        android:layout_toRightOf="@+id/item_food_iv"
        android:text="油焖大虾"
        android:textSize="20sp"
        android:textStyle="bold" />
    <TextView
        android:id="@+id/item_food_str"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/item_food_name"
        android:layout_marginTop="10dp"
        android:layout_toEndOf="@+id/item_food_iv"
        android:layout_toRightOf="@+id/item_food_iv"
        android:text="油,大虾,锅"
        android:textSize="16sp" />
    <TextView
        android:id="@+id/item_food_num"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBottom="@+id/item_food_iv"
        android:layout_alignParentEnd="true"
        android:layout_alignParentRight="true"
        android:layout_marginBottom="10dp"
        android:layout_marginEnd="20dp"
        android:layout_marginRight="20dp"
        android:text="数量:0"
        android:textSize="16sp" />
</RelativeLayout>

布局绘制结束之后,开始编写逻辑代码:

因为用到了xUtils工具,所以要对于xUtils进行整体的初始化,就需要在application当中进行初始化:

public class UniteApp extends Application{
    @Override
    public void onCreate() {
        super.onCreate();
        x.Ext.init(this);
    }
}

然后需要在清单文件当中对于application进行name属性的设置:



然后因为涉及到recyclerview展示的数据,所以数据源一定是一个集合,那么集合的类型是什么呢?我们就要根据网络数据进行分析,并且创建解析之后生成的bean类。

package com.animee.day401.demo02;

import java.util.List;

/**
 * Created by Administrator on 2018/3/7.
 */

public class RichBean {
    private int ret;
    private List<DataBean> data;
    public int getRet() {
        return ret;
    }
    public void setRet(int ret) {
        this.ret = ret;
    }
    public List<DataBean> getData() {
        return data;
    }
    public void setData(List<DataBean> data) {
        this.data = data;
    }
    public static class DataBean {
         private String id;
        private String title;
        private String pic;
        private String collect_num;
        private String food_str;
        private int num;
        public String getId() {
            return id;
        }
        public void setId(String id) {
            this.id = id;
        }
        public String getTitle() {
            return title;
        }
        public void setTitle(String title) {
            this.title = title;
        }
        public String getPic() {
            return pic;
        }
        public void setPic(String pic) {
            this.pic = pic;
        }
        public String getCollect_num() {
            return collect_num;
        }
        public void setCollect_num(String collect_num) {
            this.collect_num = collect_num;
        }
        public String getFood_str() {
            return food_str;
        }
        public void setFood_str(String food_str) {
            this.food_str = food_str;
        }
        public int getNum() {
            return num;
        }
        public void setNum(int num) {
            this.num = num;
        }
    }
}

然后对于recyclerview的适配器进行编写:

public class RichAdapter extends RecyclerView.Adapter<RichAdapter.RichViewHolder>{
    private Context context;
    private List<RichBean.DataBean>mDatas;
    public RichAdapter(Context context, List<RichBean.DataBean> mDatas) {
        this.context = context;
        this.mDatas = mDatas;
    }
    @Override
    public RichViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View itemView = LayoutInflater.from(context).inflate(R.layout.item_food_demo02,parent,false);
        RichViewHolder holder = new RichViewHolder(itemView);
        return holder;
    }
    @Override
    public void onBindViewHolder(RichViewHolder holder, int position) {
        RichBean.DataBean bean = mDatas.get(position);
        holder.nameTv.setText(bean.getTitle());
        holder.foodTv.setText(bean.getFood_str());
        holder.numTv.setText("数量:"+bean.getCollect_num());
//        使用xutils的图片模块加载图片
        x.image().bind(holder.img,bean.getPic());
    }
    @Override
    public int getItemCount() {
        return mDatas.size();
    }
    class RichViewHolder extends RecyclerView.ViewHolder{
        @ViewInject(R.id.item_food_iv)
        ImageView img;
        @ViewInject(R.id.item_food_name)
        TextView nameTv;
        @ViewInject(R.id.item_food_num)
        TextView numTv;
        @ViewInject(R.id.item_food_str)
        TextView foodTv;
        public RichViewHolder(View itemView) {
            super(itemView);
            x.view().inject(this,itemView);
        }
    }
}

以上代码与原来不同的地方在于,把查找控件的过程从findViewById改成了通过xUtils的注解模块进行查找。

最后,编写activity的代码部分:

@ContentView(R.layout.activity_food)
public class FoodActivity extends AppCompatActivity {
    @ViewInject(R.id.food_rv)
    private RecyclerView foodRv;
    private LinearLayoutManager manager;
    private String url = "http://www.qubaobei.com/ios/cf/dish_list.php?stage_id=1&limit=10&page=1";
    private List<RichBean.DataBean> mDatas;
    private RichAdapter adapter;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        x.view().inject(this);
//        设置布局管理者
        manager = new LinearLayoutManager(this,LinearLayoutManager.VERTICAL,false);
        foodRv.setLayoutManager(manager);
//        设置数据源
        mDatas = new ArrayList<>();
//        设置适配器
        adapter = new RichAdapter(this,mDatas);
        foodRv.setAdapter(adapter);
//        加载网络数据
        loadWebData(url);
    }
//    使用xUtils的网络模块加载网络数据
    private void loadWebData(String url) {
        RequestParams params = new RequestParams(url);
        x.http().get(params, new Callback.CommonCallback<String>() {
            @Override
            public void onSuccess(String s) {
//                解析数据
                Gson gson = new Gson();
                RichBean bean = gson.fromJson(s, RichBean.class);
                List<RichBean.DataBean> list = bean.getData();
//                将集合添加到数据源里
                mDatas.addAll(list);
//                提示适配器更新数据
                adapter.notifyDataSetChanged();
            }
            @Override
            public void onError(Throwable throwable, boolean b) {
            }
            @Override
            public void onCancelled(CancelledException e) {
            }
            @Override
            public void onFinished() {
            }
        });
    }
}

然后效果救出来了:



当然,这也是网络数据,所以也需要去添加网络权限,在清单当中!!!


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
一个Android基于快速开发的一个框架 xUtils 它是在aFinal基础上进行重构和扩展的框架 相比aFinal有很大的改善 同时 如果如果你的应用是基于网络的 那么只要处理得当 它会让你彻底的摆脱各种工具类和重复代码的困扰 xUtils 包含了很多实用的android工具 xUtils 源于Afinal框架 对Afinal进行了大量重构 使得xUtils支持大文件上传 更全面的http请求协议支持 拥有更加灵活的ORM 更多的事件注解支持且不受混淆影响 xUtils的四大组件: 一 ViewUtils 你受够了重复冗长的findViewById了嘛 你受够了各种监听事件的绑定了嘛 在这里 你只需要一句注解 如@ViewInject @OnClick 就能轻松摆脱小白似的代码 大大的上了一个档次 HttpUtils 支持的HTTP七种请求方式 非常便捷的满足你的接口请求的需要 同时还支持大文件上传下载 以及同步异步请求 三 BitmapUtils 你的程序因OOM强制关闭过嘛 你在为加在网络图片头疼嘛 有了组件 你将永久摆脱前面的问题 四 DbUtils 简单易用又出色的ORM框架 真的是谁用谁知道 直接轻松存储各种对象到sqlite数据库中 同时也能非常方便的进行各种条件查询 甚至分页查询 还有对表中数据的更新删除等操作 真正的实现 一行代码就可以进行增删改查 并且可通过注解自定义表名 列名 外键 唯一性约束 NOT NULL约束 CHECK约束等 支持事务 摘自github ">一个Android基于快速开发的一个框架 xUtils 它是在aFinal基础上进行重构和扩展的框架 相比aFinal有很大的改善 同时 如果如果你的应用是基于网络的 那么只要处理得当 它会让你彻底的摆脱各种工具类和重复代码的困扰 [更多]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值