1 SimpleAdapter adapter= new SimpleAdapter( this , maps , 2 android.R.layout. simple_list_item_2 , // SDK 库中提供的一个包含两个 TextView 的 layout 3 new String[]{ "name" , "desc" }, // maps 中的两个 key 4 new int []{android.R.id. text1 ,android.R.id. text2 } // 两个 TextView 的 id 5 ); 6 this .setListAdapter(adapter);就可以把maps中包含的数据按照listview默认的方式进行显示了。在android的reference里面对simpleAdapter的描述如下所示: An easy adapter to map static data to views defined in an XML file. You can specify the data backing the list as an ArrayList of Maps. Each entry in the ArrayList corresponds to one row in the list. The Maps contain the data for each row. 简单来说就是maps中的每一项数据对应着表格中的每一行。maps的数据类型是:ArrayList<Map<String,String>>,可以存放HashMap数据。 this.setListAdapter则可以把adapter的指针传给ListActivity。
1 Intent intent=new Intent(); 2 3 Bundle b = new Bundle(); 4 b.putString("DataKind", ""+id); 5 //此处使用putExtras,接受方就响应的使用getExtra 6 intent.putExtras( b ); 7 8 intent.setClass(MainActivity.this,TestActivity.class); 9 startActivity(intent);
1 GraphicalView getChartView = ChartFactory.getBarChartView( 2 context , mDataSet, renderer, Type.DEFAULT );其中, mDataSet是要显示的数据集合,把数据放到Series series中,通过 mDataSet.addSeries(series.toXYSeries());即可; render是渲染器,可以设置图表的一些属性,比如显示个数/显示范围/显示颜色等。 调用ChartFactory中不同的函数可以获得不同的图表类型,这里getBarChartView获得的是条形图。 有不少的例子可以学习, 至于动态更新图表的问题的解决方案,在互联网上搜了一圈,也没有找到比较可靠的成熟的处理方法,只能在handler中更新UI的方式来实现。 具体说来就是每隔一段时间(这里的更新时间是500ms),在handler里面删除旧的view,更新mDataSet里面的数据后用ChartFactory得到新的 view,放在原来的位置上,形成动态效果(view每500ms更新一次,其实是view每500ms替换一次。) 这里面有两个问题需要说清楚,第一个是为什么要在handler里面更新UI,第二个是线程与进程。 这里可以补充一些进程与线程的基础知识。 一个安卓app独占一个进程,一个进程中可以有多个线程(thread),实际处理问题的是线程。 进程中的main thread 是 UI thread , 其主要的功能是负责UI界面的显示/更新和空间交互。 为了保证界面的流畅性,费时的工作应该放在其他线程中去执行,如果需要更新UI,则通过handler来告知主线程,在且只能在主线程的handler message中去执行更新 UI的操作。 handler的作用:把消息加入特定的消息队列中,并分发和处理消息队列中的消息。构造handler时可以指定一个looper对象,默认为当前线程的looper构建。 调用handler 的sendmessage接口,就会把消息放入到消息队列中。 在activity中建立handler不需要looper,因为activity有自己的looper,但在新的线程中建立handler时,则需要使用下面的方法:
1 Looper.prepare(); 2 myThreadHandler = new Handler() { 3 public void handleMessage(android.os.Message msg) { 4 } 5 }; 6 Looper.myLooper().loop();//建立一个消息循环,该线程不会退出实现动态更新UI的过程如下所示: (注:使用dispatchMessage的原因:如果Message对象自带callback对象,dispatchMessage执行的就是msg的callback中对应的run方法,而handler.post(runnable r)就是把r添加到msg.callback中去)
1 public static byte[] serializeObject(Object o) { 2 ByteArrayOutputStream bos = new ByteArrayOutputStream(); 3 4 try { 5 ObjectOutput out = new ObjectOutputStream(bos); 6 out.writeObject(o); 7 out.close(); 8 9 // Get the bytes of the serialized object 10 byte[] buf = bos.toByteArray(); 11 12 return buf; 13 } catch(IOException ioe) { 14 Log.e("serializeObject", "error", ioe); 15 16 return null; 17 } 18 } 19 20 21 public static Object deserializeObject(byte[] b) { 22 try { 23 ObjectInputStream in = new ObjectInputStream(new ByteArrayInputStream(b)); 24 Object object = in.readObject(); 25 in.close(); 26 27 return object; 28 } catch(ClassNotFoundException cnfe) { 29 Log.e("deserializeObject", "class not found error", cnfe); 30 31 return null; 32 } catch(IOException ioe) { 33 Log.e("deserializeObject", "io error", ioe); 34 35 return null; 36 } 37 }
serializeObject对list类型的数据可以有规律的存储,从而在deserializeObject中有规律的解出来。 使用方法如下:
1 2 byte[] dByte = serializeObject(listDArray); 3 SerializedListData = (List<List<Double>> ) deserializeObject(dByte);其中,listDArray和SerializedListData都是List<List<Double>>类型的数据。 总结起来好水~~一个星期只做了这么点工作,不过也算学到了一些知识。 第一篇实习总结文章,有不对或者不清楚的地方欢迎留下评论~