您的位置:首页 > 产品设计 > UI/UE

基于sax的xml解析 含源码 UI类(二)

2015-04-22 13:38 218 查看
本节为UI部分,顺带简单的使用Thread+handler

布局类:只有两个xml文件

activity_main:主布局,仅仅只有一个listView不在给出。

item.xml使用的是相对布局,用来显示listView的各项。

<?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="20dp" 
    android:gravity="center"
    >
     
    <TextView
        android:id="@+id/name_tv"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBottom="@+id/id_tv"
        android:layout_marginLeft="60dp"
        android:layout_toRightOf="@+id/id_tv"
        android:text="TextView" />

    <TextView
        android:id="@+id/age_tv"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBaseline="@+id/name_tv"
        android:layout_alignBottom="@+id/name_tv"
        android:layout_alignParentRight="true"
        android:layout_marginRight="19dp"
        android:text="TextView" />

    <TextView
        android:id="@+id/id_tv"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true"
        android:layout_marginTop="76dp"
        android:text="TextView" />

</RelativeLayout>
主类

public class MainActivity extends Activity{

	private ListView listView=null;
	private static final String TAG="parserXML";
	private static final int MSG_SUCCESS = 1;//请求成功
	//private static final int MSG_FAILURE = 0;//获取失败的标识 
	
	private Handler mHandler = new Handler() {
		public void handleMessage (Message msg) {//此方法在ui线程运行
			
			switch (msg.what) {
			case MSG_SUCCESS:
				//获取传递过来的数据
				List<Person> list = (List<Person>) msg.obj;
				//打印
				for(Person person: list)
				{
					Log.d(TAG, person.toString());
				}
				
				MyAdapter adapter=new MyAdapter(list);
				adapter.notifyDataSetChanged();
				listView.setAdapter(adapter);
				break;
			default:
				break;
			}
		}

		
		
	};
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		listView=(ListView) this.findViewById(R.id.listView1);
		doParserXML();
	}
    public class MyAdapter extends BaseAdapter
    {
        private List<Person>list;
        //传递一个list进来
        public MyAdapter(List<Person>list) {
			this.list=list;
		}
         //返回数目
		@Override
		public int getCount() {
			return list.size();
		}
        //获取position处的数据
		@Override
		public Object getItem(int position) {
			return list.get(position);
		}
        //返回item的id
		@Override
		public long getItemId(int position) {
			return position;
		}
         //返回view
		@Override
		public View getView(int position, View convertView, ViewGroup parent) {
			LayoutInflater inflater=LayoutInflater.from(MainActivity.this);
			ViewHolder viewHolder=null;
			if(convertView==null)
			{//跟iOS的重用机制类似,且对xml的加载进行优化
				viewHolder=new ViewHolder(); 
				convertView=inflater.inflate(R.layout.item,null);
				viewHolder.id_tv=(TextView)convertView.findViewById(R.id.id_tv);
				viewHolder.name_tv=(TextView)convertView.findViewById(R.id.name_tv);
				viewHolder.age_tv=(TextView)convertView.findViewById(R.id.age_tv);
				//使用tag来标识
				convertView.setTag(viewHolder);
				
			}
			else {
				//使用tag来取出
				viewHolder=(ViewHolder) convertView.getTag();
			}
			Person person=list.get(position);
			viewHolder.id_tv.setText(person.getId()+"");
			viewHolder.age_tv.setText(person.getAge()+"");
			viewHolder.name_tv.setText(person.getName()+"");
			
			return convertView;
		}
    	
    }
	protected void doParserXML() {
		new Thread(new Runnable() {
			
			@Override
			public void run() {
				
				Log.d(TAG,"开始解析XML");
				InputStream inputStream=HttpUtils.getXML();
				List<Person>list=parserXMLUtils.XMLParser(inputStream, "person");
				//使用obtainMessage(),获取一个消息
				Message message=mHandler.obtainMessage();
				message.what=MSG_SUCCESS;
				message.obj=list;
				mHandler.sendMessage(message);
			}
		}).start();
		
		
	}
    public class ViewHolder  
    {
    	public TextView id_tv;
    	public TextView name_tv;
    	public TextView age_tv;
    }
	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.main, menu);
		return true;
	}

}
流程---》

1. 先进行数据处理:

doParserXML()
2. 将返回的数据传递给handler

3. Handler 中listView绑定adapter。

ps:adapter的使用,baseAdapter跟iOS UItableView 简直神似呀。(delegate方法和adapter的接口的含义基本上是一个意思)

list的优化也和tableView神似:单元格重用。

源码如下:

andriod 的xml解析
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: