Pull解析XML文件-采用自定义布局

前端之家收集整理的这篇文章主要介绍了Pull解析XML文件-采用自定义布局前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

除了可以使用 SAX和DOM解析XML文件,大家也可以使用Android内置的Pull解析器解析XML文件。 Pull解析器的运行方式与 SAX 解析器相似。它提供了类似的事件,如:开始元素和结束元素事件,使用parser.next()可以进入下一个元素并触发相应事件。事件将作为数值代码被发送,因此可以使用一个switch对感兴趣的事件进行处理。当元素开始解析时,调用parser.nextText()方法可以获取下一个Text类型元素的值。

1.新建pullxml项目

2.orders.xml文件存放在res–>xml文件夹中

@H_301_7@<?xml version="1.0" encoding="UTF-8"?> <orders> <order> <good> <name>哈尼蛋糕1</name> <price>18</price> <sum>2</sum> </good> <iprice>36</iprice> <!-- 未消费11 已消费评价 12 评价过的 13 退款中14 已退款 15 --> <status>11</status> </order> <order> <good> <name>哈尼蛋糕2</name> <price>12</price> <sum>2</sum> </good> <iprice>24</iprice> <!-- 未消费11 已消费评价 12 评价过的 13 退款中14 已退款 15 --> <status>14</status> </order> <order> <good> <name>哈尼蛋糕3</name> <price>18</price> <sum>2</sum> </good> <iprice>36</iprice> <!-- 未消费11 已消费评价 12 评价过的 13 退款中14 已退款 15 --> <status>13</status> </order> <order> <good> <name>哈尼蛋糕4</name> <price>10</price> <sum>2</sum> </good> <iprice>20</iprice> <!-- 未消费11 已消费评价 12 评价过的 13 退款中14 已退款 15 --> <status>12</status> </order> </orders>

3.在activity_main.xml中添加ListView控件

@H_301_7@<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="${relativePackage}.${activityClass}" > <ListView android:id="@+id/lv_orders" android:layout_width="match_parent" android:layout_height="match_parent" /> </RelativeLayout>

4.order_item.xml

@H_301_7@<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="center_vertical|center_horizontal" android:orientation="horizontal" android:paddingBottom="5dp" android:paddingTop="5dp" > <!-- 图片 --> <ImageView android:id="@+id/iv_icon" android:layout_width="100dp" android:layout_height="100dp" android:layout_marginLeft="10dp" android:src="@drawable/honey" /> <LinearLayout android:layout_width="0dp" android:layout_height="100dp" android:layout_marginLeft="10dp" android:layout_marginRight="20dp" android:layout_weight="1" android:orientation="vertical" > <TextView android:id="@+id/tv_name" android:layout_width="match_parent" android:layout_height="wrap_content" android:ellipsize="end" android:lineSpacingExtra="2dp" android:maxLines="2" android:text="【三店通用】哈尼蛋糕: 10英寸汽车蛋糕1个" /> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="10dp" android:orientation="horizontal" > <TextView android:id="@+id/tv_iprice" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="3" android:text="总价:98" /> <TextView android:id="@+id/tv_sum" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="3" android:gravity="right" android:text="数量:1" /> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" > <Button android:id="@+id/btn_status" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:gravity="center" android:text="评价" /> <RatingBar android:id="@+id/rb_star" style="?android:attr/ratingBarStyleSmall" android:layout_width="wrap_content" android:layout_height="wrap_content" android:numStars="3" /> <TextView android:id="@+id/tv_status" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:text="申请退款" android:textColor="#ff8c00" /> </LinearLayout> </LinearLayout> </LinearLayout>

5.Goods.java

6.Orders.java

7.XmlService.java用来解析xml文件

@H_301_7@package com.example.service; import java.io.IOException; import java.util.ArrayList; import java.util.List; import org.xmlpull.v1.XmlPullParser; import org.xmlpull.v1.XmlPullParserException; import android.content.Context; import android.content.res.XmlResourceParser; import com.example.domain.Goods; import com.example.domain.Orders; import com.example.pullxml.R; public class XmlService { /** * 解析指定文件 * * @param context * @return * @throws XmlPullParserException * @throws IOException */ public List<Orders> parserXml(Context context) throws XmlPullParserException,IOException { List<Orders> data = null; // 解析xml文件内容 // 1.获取XmlResourceParser解析器对象 XmlResourceParser parser = context.getResources().getXml(R.xml.orders); // 2.获取解析的类型 int eventType = parser.getEventType(); // 类型代表 开始文档 结束文档 开始元素 结束元素 注解 // text 等等 // 声明订单 Orders orders = null; // 声明订单对应的商品 Goods good = null; // 3.判断解析的类型是否当文档末尾 while (eventType != parser.END_DOCUMENT) { // 获取解析的tagName标签 String tagName = parser.getName(); // 判断类型 switch (eventType) { case XmlPullParser.START_DOCUMENT: data = new ArrayList<Orders>(); break; case XmlPullParser.START_TAG: if ("order".equals(tagName)) { // 创建订单对象 orders = new Orders(); } else if ("good".equals(tagName)) { // 商品对象 good = new Goods(); } else if ("name".equals(tagName)) { // 获取文本值 good.setName(parser.nextText()); } else if ("price".equals(tagName)) { good.setPrice(Double.parseDouble(parser.nextText())); } else if ("sum".equals(tagName)) { good.setSum(Integer.valueOf(parser.nextText())); } else if ("iprice".equals(tagName)) { orders.setPrice(Double.valueOf(parser.nextText())); } else if ("status".equals(tagName)) { orders.setStatue(Integer.valueOf(parser.nextText())); } break; case XmlPullParser.END_TAG: if ("order".equals(tagName)) { // 加入到订单的集合中 data.add(orders); // 创建订单对象 orders = null; } else if ("good".equals(tagName)) { // 加入到订单中 orders.setGood(good); // 商品对象 good = null; } break; } // 解析下一个 eventType = parser.next(); } return data; } }

8.OrdersAdapter.java

@H_301_7@package com.example.adapter; import java.util.List; import android.content.Context; import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.Button; import android.widget.ImageView; import android.widget.RatingBar; import android.widget.TextView; import android.widget.Toast; import com.example.domain.Orders; import com.example.pullxml.R; public class OrdersAdapter extends BaseAdapter { // 显示数据 private List<Orders> data = null; // 上下文 private Context context; // 绑定对象 private ViewHolder viewHolder; // 构造函数 public OrdersAdapter(Context context,List<Orders> data) { this.context = context; this.data = data; } @Override public int getCount() { // TODO Auto-generated method stub return data.size(); } @Override public Object getItem(int position) { // TODO Auto-generated method stub return data.get(position); } @Override public long getItemId(int position) { // TODO Auto-generated method stub return position; } // 返回条目对应View控件对象 @Override public View getView(int position,View convertView,ViewGroup parent) { // 1.判断convertView是否为null if (convertView == null) { // 2.创建绑定的对象 viewHolder = new ViewHolder(); // 3.把一个布局文件转换成View对象 convertView = View.inflate(context,R.layout.order_item,null); // 4.获取布局文件中的控件对象 赋值给绑定对象对应的属性 viewHolder.tv_name = (TextView) convertView .findViewById(R.id.tv_name); viewHolder.tv_iprice = (TextView) convertView .findViewById(R.id.tv_iprice); viewHolder.tv_sum = (TextView) convertView .findViewById(R.id.tv_sum); viewHolder.tv_status = (TextView) convertView .findViewById(R.id.tv_status); viewHolder.btn_status = (Button) convertView .findViewById(R.id.btn_status); viewHolder.rb_star = (RatingBar) convertView.findViewById(R.id.rb_star); // 5.设置标志 convertView.setTag(viewHolder); } else { // 6.直接获取viewHolder对象 viewHolder = (ViewHolder) convertView.getTag(); } // 获取显示的的订单 Orders o = data.get(position); viewHolder.tv_name.setText(o.getGood().getName()); viewHolder.tv_iprice.setText(o.getPrice() + ""); viewHolder.tv_sum.setText(o.getGood().getSum() + ""); // <!-- 未消费11 已消费评价 12 评价过的 13 退款中14 已退款 15 --> if (o.getStatue() == 11) { // 设置控件是否可见 viewHolder.rb_star.setVisibility(View.GONE); viewHolder.btn_status.setVisibility(View.GONE); viewHolder.tv_status.setText("未消费"); } else if (o.getStatue() == 12) { viewHolder.rb_star.setVisibility(View.GONE); viewHolder.tv_status.setVisibility(View.GONE); viewHolder.btn_status.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Toast.makeText(context,"点击了评价",1).show(); viewHolder.btn_status.setVisibility(View.GONE); viewHolder.rb_star.setVisibility(View.VISIBLE); } }); } else if (o.getStatue() == 13) { viewHolder.rb_star.setVisibility(View.GONE); viewHolder.btn_status.setVisibility(View.GONE); viewHolder.tv_status.setText("已评价"); } else if (o.getStatue() == 14) { viewHolder.rb_star.setVisibility(View.GONE); viewHolder.btn_status.setVisibility(View.GONE); viewHolder.tv_status.setText("退款中"); } else if (o.getStatue() == 15) { viewHolder.rb_star.setVisibility(View.GONE); viewHolder.btn_status.setVisibility(View.GONE); viewHolder.tv_status.setText("已退款"); } return convertView; } class ViewHolder { public TextView tv_name,tv_iprice,tv_sum,tv_status; public Button btn_status; public ImageView iv_icon; public RatingBar rb_star; } }

9.MainActivity.java

10.演示效果

点击评价按钮

猜你在找的XML相关文章