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

  在本篇博客当中结合xutils的注解模块,网络模块和图片模块,将网络数据获取解析并展示在recyclerview上面。
网络数据的网址为:https://gitee.com/little_bird_oh_777/test_data_collection/raw/master/dishs.xml
首先分析步骤:
1.导入包:xutils和recyclerview的包
复制xutils.jar包,粘贴到libs文件夹下,然后选中鼠标右键,然后点击Add As Library,点击ok
点击选择Project Structure--->选择当前的module---》选择 library dependenices
--->找到RecyclerView点击--->该版本号,改成和v7一样的版本号---》点击finish
2.绘制布局(2个布局,一个是activity对应的布局,另一个每一个item对应的布局)
3.编写逻辑代码 
3.1 : 在application当中,初始化xUtils模块。(详情请见以下代码部分)
3.2:  查找控件 使用xutils的注解模块进行查找
                        3.3 :   设置RecyclerView的布局管理器
   3.4:设置适配器   3.5:  获取网络数据
4.在清单文件里面添加网络权限。
开始编写代码内容:
2.1首先编写activity_xml_parse布局的代码:
<?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"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">
    <android.support.v7.widget.Toolbar
        android:id="@+id/toolbar"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@color/colorPrimary"
        app:subtitle="亲,你饿了么?"
        app:subtitleTextColor="#FFF"
        app:title="家常菜大全"
        app:titleTextColor="#FFF">
    </android.support.v7.widget.Toolbar>
    <android.support.v7.widget.RecyclerView
        android:id="@+id/yk_rv"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
    </android.support.v7.widget.RecyclerView>
</LinearLayout>
2.2 编写每一个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_yk_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_yk_name"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:layout_marginLeft="10dp"
        android:layout_toRightOf="@+id/item_yk_iv"
        android:text="油焖大虾"
        android:textSize="20sp"
        android:textStyle="bold" />
    <TextView
        android:id="@+id/item_yk_food"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/item_yk_name"
        android:layout_marginTop="10dp"
        android:layout_toEndOf="@+id/item_yk_iv"
        android:layout_toRightOf="@+id/item_yk_iv"
        android:text="油,大虾,锅"
        android:textSize="16sp" />
    <TextView
        android:id="@+id/item_yk_num"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBottom="@+id/item_yk_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>
        3.1.创建application类的子类,并且初始化xUtils的模块。
public class UniteApp extends Application{
    @Override
    public void onCreate() {
        super.onCreate();
        x.Ext.init(this);
    }
}
   需要注意的是,我们需要把自定义的application类在清单文件当中进行注册。找到application标签,添加name属性,如   android:name=".UniteApp",注册之后的效果,如下图所示:


        

3.2.1   设置需要写的解析bean类

public class FoodBean {
    private String name;
    private String img;
    private String burdens;
    private String favorites;
    public FoodBean() {}
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getImg() {
        return img;
    }
    public void setImg(String img) {
        this.img = img;
    }
    public String getBurdens() {
        return burdens;
    }
    public void setBurdens(String burdens) {
        this.burdens = burdens;
    }
    public String getFavorites() {
        return favorites;
    }
    public void setFavorites(String favorites) {
        this.favorites = favorites;
    }
}

3.2.2接下来,对于recyclerview的适配器进行编写,具体步骤请看前两篇博客

public class FoodAdapter extends RecyclerView.Adapter<FoodAdapter.FoodViewHolder>{
    private Context context;
    private List<FoodBean>mDatas;
    public FoodAdapter(Context context, List<FoodBean> mDatas) {
        this.context = context;
        this.mDatas = mDatas;
    }
    @Override
    public FoodViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View itemView = LayoutInflater.from(context).inflate(R.layout.item_rv_yk,parent,false);
        FoodViewHolder holder = new FoodViewHolder(itemView);
        return holder;
    }
    @Override
    public void onBindViewHolder(FoodViewHolder holder, int position) {
//        获取指定位置的数据
        final FoodBean foodBean = mDatas.get(position);
        holder.foodTv.setText(foodBean.getBurdens());
        holder.nameTv.setText(foodBean.getName());
        holder.numTv.setText("数量:"+foodBean.getFavorites());
//        加载网络图片  不用picasso,使用xutils的图片模块
        x.image().bind(holder.iv,foodBean.getImg());
        holder.itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(context,foodBean.getName(),Toast.LENGTH_SHORT).show();
            }
        });
    }
    @Override
    public int getItemCount() {
        return mDatas.size();
    }
    class FoodViewHolder extends RecyclerView.ViewHolder{
        ImageView iv;
        TextView nameTv,foodTv,numTv;
        public FoodViewHolder(View itemView) {
            super(itemView);
            iv = (ImageView) itemView.findViewById(R.id.item_yk_iv);
            nameTv = (TextView) itemView.findViewById(R.id.item_yk_name);
            foodTv = (TextView) itemView.findViewById(R.id.item_yk_food);
            numTv = (TextView) itemView.findViewById(R.id.item_yk_num);
        }
    }
}
3.2.3 把解析数据的过程,封装成类。然后把解析的步骤,放到这个类的方法当中。

public class ParseXMLData {
    public static List<FoodBean>parseXML(String s){
        List<FoodBean>beanList = new ArrayList<>();
        try {
            XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
            XmlPullParser pullParser = factory.newPullParser();
            ByteArrayInputStream stream = new ByteArrayInputStream(s.getBytes());
            pullParser.setInput(stream,"utf-8");
            int type = pullParser.getEventType();
            FoodBean bean = null;
            while (type != XmlPullParser.END_DOCUMENT) {
                String name = pullParser.getName();
                switch (type) {
                    case XmlPullParser.START_TAG:
                        if (name.equals("dishs")) {
                            bean = new FoodBean();
                        }else if (name.equals("name")) {
                            bean.setName(pullParser.nextText());
                        }else if (name.equals("burdens")) {
                            bean.setBurdens(pullParser.nextText());
                        }else if (name.equals("favorites")) {
                            bean.setFavorites(pullParser.nextText());
                        }else if (name.equals("img")) {
                            bean.setImg(pullParser.nextText());
                        }
                        break;
                    case XmlPullParser.END_TAG:
                        if (name.equals("dishs")) {
                            beanList.add(bean);
                        }
                        break;
                }
                type = pullParser.next();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return beanList;
    }
}
3.2.4 准备工作完成了,编写activity当中的代码

@ContentView(R.layout.activity_xml_parse)
public class XmlParseActivity extends AppCompatActivity {
    public String url = "https://gitee.com/little_bird_oh_777/test_data_collection/raw/master/dishs.xml";
    @ViewInject(R.id.toolbar)
    private Toolbar toolbar;
    @ViewInject(R.id.yk_rv)
    private RecyclerView rv;
    private LinearLayoutManager manager;
    private List<FoodBean> mDatas;
    private FoodAdapter adapter;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        x.view().inject(this);   //初始化注解模块
//      设置布局管理者
        manager = new LinearLayoutManager(this,LinearLayoutManager.VERTICAL,false);
        rv.setLayoutManager(manager);
//        设置数据源
        mDatas = new ArrayList<>();
//        设置适配器
        adapter = new FoodAdapter(this,mDatas);
        rv.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) {
                Log.i("AAA", "onSuccess: "+s);
                Toast.makeText(XmlParseActivity.this,"网络获取数据成功!",Toast.LENGTH_SHORT).show();
//                代表请求数据成功会执行的方法   onPostExecute
//                解析数据的工作
                List<FoodBean> beanList = ParseXMLData.parseXML(s);
//                将集合添加到数据源当中
                mDatas.addAll(beanList);
//                提示适配器更新数据
                adapter.notifyDataSetChanged();
            }
            @Override
            public void onError(Throwable throwable, boolean b) {
//              请求数据失败会执行的方法
            }
            @Override
            public void onCancelled(CancelledException e) {
//              请求数据取消会执行的方法
            }
            @Override
            public void onFinished() {
//              请求数据完成会执行的方法
            }
        });
    }
}


最后,最重要的是一定要填写网络权限!!!!
然后就可以显示数据在recyclerview上了。以下为显示的效果图:






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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值