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文件夹中

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <orders>
  3. <order>
  4. <good>
  5. <name>哈尼蛋糕1</name>
  6. <price>18</price>
  7. <sum>2</sum>
  8. </good>
  9. <iprice>36</iprice>
  10. <!-- 未消费11 已消费评价 12 评价过的 13 退款中14 已退款 15 -->
  11. <status>11</status>
  12. </order>
  13. <order>
  14. <good>
  15. <name>哈尼蛋糕2</name>
  16. <price>12</price>
  17. <sum>2</sum>
  18. </good>
  19. <iprice>24</iprice>
  20. <!-- 未消费11 已消费评价 12 评价过的 13 退款中14 已退款 15 -->
  21. <status>14</status>
  22. </order>
  23. <order>
  24. <good>
  25. <name>哈尼蛋糕3</name>
  26. <price>18</price>
  27. <sum>2</sum>
  28. </good>
  29. <iprice>36</iprice>
  30. <!-- 未消费11 已消费评价 12 评价过的 13 退款中14 已退款 15 -->
  31. <status>13</status>
  32. </order>
  33. <order>
  34. <good>
  35. <name>哈尼蛋糕4</name>
  36. <price>10</price>
  37. <sum>2</sum>
  38. </good>
  39. <iprice>20</iprice>
  40. <!-- 未消费11 已消费评价 12 评价过的 13 退款中14 已退款 15 -->
  41. <status>12</status>
  42. </order>
  43. </orders>

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

  1. <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}" >
  2.  
  3. <ListView android:id="@+id/lv_orders" android:layout_width="match_parent" android:layout_height="match_parent" />
  4.  
  5. </RelativeLayout>

4.order_item.xml

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <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" >
  3.  
  4. <!-- 图片 -->
  5.  
  6. <ImageView android:id="@+id/iv_icon" android:layout_width="100dp" android:layout_height="100dp" android:layout_marginLeft="10dp" android:src="@drawable/honey" />
  7.  
  8. <LinearLayout android:layout_width="0dp" android:layout_height="100dp" android:layout_marginLeft="10dp" android:layout_marginRight="20dp" android:layout_weight="1" android:orientation="vertical" >
  9.  
  10. <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个" />
  11.  
  12. <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="10dp" android:orientation="horizontal" >
  13.  
  14. <TextView android:id="@+id/tv_iprice" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="3" android:text="总价:98" />
  15.  
  16. <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" />
  17. </LinearLayout>
  18.  
  19. <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" >
  20.  
  21. <Button android:id="@+id/btn_status" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:gravity="center" android:text="评价" />
  22.  
  23. <RatingBar android:id="@+id/rb_star" style="?android:attr/ratingBarStyleSmall" android:layout_width="wrap_content" android:layout_height="wrap_content" android:numStars="3" />
  24.  
  25.  
  26. <TextView android:id="@+id/tv_status" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:text="申请退款" android:textColor="#ff8c00" />
  27. </LinearLayout>
  28. </LinearLayout>
  29.  
  30. </LinearLayout>

5.Goods.java

6.Orders.java

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

  1. package com.example.service;
  2.  
  3. import java.io.IOException;
  4. import java.util.ArrayList;
  5. import java.util.List;
  6.  
  7. import org.xmlpull.v1.XmlPullParser;
  8. import org.xmlpull.v1.XmlPullParserException;
  9.  
  10. import android.content.Context;
  11. import android.content.res.XmlResourceParser;
  12.  
  13. import com.example.domain.Goods;
  14. import com.example.domain.Orders;
  15. import com.example.pullxml.R;
  16.  
  17. public class XmlService {
  18.  
  19. /** * 解析指定文件 * * @param context * @return * @throws XmlPullParserException * @throws IOException */
  20. public List<Orders> parserXml(Context context)
  21. throws XmlPullParserException,IOException {
  22. List<Orders> data = null;
  23. // 解析xml文件内容
  24. // 1.获取XmlResourceParser解析器对象
  25. XmlResourceParser parser = context.getResources().getXml(R.xml.orders);
  26.  
  27. // 2.获取解析的类型
  28. int eventType = parser.getEventType(); // 类型代表 开始文档 结束文档 开始元素 结束元素 注解
  29. // text 等等
  30. // 声明订单
  31. Orders orders = null;
  32. // 声明订单对应的商品
  33. Goods good = null;
  34.  
  35. // 3.判断解析的类型是否当文档末尾
  36. while (eventType != parser.END_DOCUMENT) {
  37. // 获取解析的tagName标签
  38. String tagName = parser.getName();
  39. // 判断类型
  40. switch (eventType) {
  41. case XmlPullParser.START_DOCUMENT:
  42. data = new ArrayList<Orders>();
  43. break;
  44. case XmlPullParser.START_TAG:
  45. if ("order".equals(tagName)) {
  46. // 创建订单对象
  47. orders = new Orders();
  48. } else if ("good".equals(tagName)) {
  49. // 商品对象
  50. good = new Goods();
  51. } else if ("name".equals(tagName)) {
  52. // 获取文本值
  53. good.setName(parser.nextText());
  54. } else if ("price".equals(tagName)) {
  55. good.setPrice(Double.parseDouble(parser.nextText()));
  56. } else if ("sum".equals(tagName)) {
  57. good.setSum(Integer.valueOf(parser.nextText()));
  58. } else if ("iprice".equals(tagName)) {
  59. orders.setPrice(Double.valueOf(parser.nextText()));
  60. } else if ("status".equals(tagName)) {
  61. orders.setStatue(Integer.valueOf(parser.nextText()));
  62. }
  63. break;
  64. case XmlPullParser.END_TAG:
  65.  
  66. if ("order".equals(tagName)) {
  67. // 加入到订单的集合中
  68. data.add(orders);
  69. // 创建订单对象
  70. orders = null;
  71. } else if ("good".equals(tagName)) {
  72. // 加入到订单中
  73. orders.setGood(good);
  74. // 商品对象
  75. good = null;
  76. }
  77. break;
  78. }
  79.  
  80. // 解析下一个
  81. eventType = parser.next();
  82. }
  83.  
  84. return data;
  85. }
  86. }

8.OrdersAdapter.java

  1. package com.example.adapter;
  2.  
  3. import java.util.List;
  4.  
  5. import android.content.Context;
  6. import android.view.View;
  7. import android.view.View.OnClickListener;
  8. import android.view.ViewGroup;
  9. import android.widget.BaseAdapter;
  10. import android.widget.Button;
  11. import android.widget.ImageView;
  12. import android.widget.RatingBar;
  13. import android.widget.TextView;
  14. import android.widget.Toast;
  15.  
  16. import com.example.domain.Orders;
  17. import com.example.pullxml.R;
  18.  
  19. public class OrdersAdapter extends BaseAdapter {
  20.  
  21. // 显示数据
  22. private List<Orders> data = null;
  23. // 上下文
  24. private Context context;
  25. // 绑定对象
  26. private ViewHolder viewHolder;
  27.  
  28. // 构造函数
  29. public OrdersAdapter(Context context,List<Orders> data) {
  30. this.context = context;
  31. this.data = data;
  32. }
  33.  
  34. @Override
  35. public int getCount() {
  36. // TODO Auto-generated method stub
  37. return data.size();
  38. }
  39.  
  40. @Override
  41. public Object getItem(int position) {
  42. // TODO Auto-generated method stub
  43. return data.get(position);
  44. }
  45.  
  46. @Override
  47. public long getItemId(int position) {
  48. // TODO Auto-generated method stub
  49. return position;
  50. }
  51.  
  52. // 返回条目对应View控件对象
  53. @Override
  54. public View getView(int position,View convertView,ViewGroup parent) {
  55. // 1.判断convertView是否为null
  56. if (convertView == null) {
  57. // 2.创建绑定的对象
  58. viewHolder = new ViewHolder();
  59. // 3.把一个布局文件转换成View对象
  60. convertView = View.inflate(context,R.layout.order_item,null);
  61. // 4.获取布局文件中的控件对象 赋值给绑定对象对应的属性
  62. viewHolder.tv_name = (TextView) convertView
  63. .findViewById(R.id.tv_name);
  64. viewHolder.tv_iprice = (TextView) convertView
  65. .findViewById(R.id.tv_iprice);
  66. viewHolder.tv_sum = (TextView) convertView
  67. .findViewById(R.id.tv_sum);
  68. viewHolder.tv_status = (TextView) convertView
  69. .findViewById(R.id.tv_status);
  70. viewHolder.btn_status = (Button) convertView
  71. .findViewById(R.id.btn_status);
  72. viewHolder.rb_star = (RatingBar) convertView.findViewById(R.id.rb_star);
  73. // 5.设置标志
  74. convertView.setTag(viewHolder);
  75.  
  76. } else {
  77. // 6.直接获取viewHolder对象
  78. viewHolder = (ViewHolder) convertView.getTag();
  79. }
  80. // 获取显示的的订单
  81. Orders o = data.get(position);
  82. viewHolder.tv_name.setText(o.getGood().getName());
  83. viewHolder.tv_iprice.setText(o.getPrice() + "");
  84. viewHolder.tv_sum.setText(o.getGood().getSum() + "");
  85. // <!-- 未消费11 已消费评价 12 评价过的 13 退款中14 已退款 15 -->
  86. if (o.getStatue() == 11) {
  87. // 设置控件是否可见
  88. viewHolder.rb_star.setVisibility(View.GONE);
  89. viewHolder.btn_status.setVisibility(View.GONE);
  90. viewHolder.tv_status.setText("未消费");
  91. } else if (o.getStatue() == 12) {
  92. viewHolder.rb_star.setVisibility(View.GONE);
  93. viewHolder.tv_status.setVisibility(View.GONE);
  94. viewHolder.btn_status.setOnClickListener(new OnClickListener() {
  95.  
  96. @Override
  97. public void onClick(View v) {
  98. Toast.makeText(context,"点击了评价",1).show();
  99. viewHolder.btn_status.setVisibility(View.GONE);
  100. viewHolder.rb_star.setVisibility(View.VISIBLE);
  101. }
  102. });
  103. } else if (o.getStatue() == 13) {
  104. viewHolder.rb_star.setVisibility(View.GONE);
  105. viewHolder.btn_status.setVisibility(View.GONE);
  106. viewHolder.tv_status.setText("已评价");
  107. } else if (o.getStatue() == 14) {
  108. viewHolder.rb_star.setVisibility(View.GONE);
  109. viewHolder.btn_status.setVisibility(View.GONE);
  110. viewHolder.tv_status.setText("退款中");
  111. } else if (o.getStatue() == 15) {
  112. viewHolder.rb_star.setVisibility(View.GONE);
  113. viewHolder.btn_status.setVisibility(View.GONE);
  114. viewHolder.tv_status.setText("已退款");
  115. }
  116. return convertView;
  117. }
  118.  
  119. class ViewHolder {
  120. public TextView tv_name,tv_iprice,tv_sum,tv_status;
  121. public Button btn_status;
  122. public ImageView iv_icon;
  123. public RatingBar rb_star;
  124. }
  125.  
  126. }

9.MainActivity.java

10.演示效果

点击评价按钮

猜你在找的XML相关文章