本节为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神似:单元格重用。
源码如下: