3.常用的UI布局
1). LinearLayout: 线性布局
用来控制其子View以水平或垂直方式展开显示
2). RelativeLayout:相对布局
用来控制其子View以相对定位的方式进行布局显示
3). FrameLayout:帧布局
每一个子 View都代表一个画面,后面 出现的会覆盖前面的画面
通过子View的android:layout gravity属性来指定子视图的位置
4.常用的视图标签的属性
1). 视图的常用属性
届性名 作用
id 为控件指定相应的ID @+id/idname
layout_ width 指定当前视图的宽度
layout height 指定当前视图的宽度
text 指定控件当中显示的文字
textSize 指定控件当中字体的大小
background 指定该控件所使用的背景(图片|颜色)
ayout gravity 控件本身相对于父视图的位置
grivity 指定控件中的内容的基本位置
内边距属性
android:padding
android:paddingLeft
android:paddingTop
android:paddingRight
android:paddingBottom
外边距属性
android:layout lmargin
androidlayout marginLeft
androidlayout marginTop
android:layout marginRight
android:ayout marginBottom
2).只针对RelativeLayout
相对兄弟视图定位
同方向对齐属性
androidlayout. alignleft
android:layout alignTop
android:layout alignRight
android:layout alignBottom
反方向对齐属性
androidlayout toleftOf
androidlayout toRightOf
android;layout above
android;layout below
相对父视图定位
与父视图同方向对齐属性
android:layout alignParentLeft
android: layout. alignParentTop
android: layout alignParentRight
android:layout alignParentBottom
相对父视图居中属性
android;layout centerInParent
android:layout tenterVertical
android; layout CenterHorizontal
3).只针对LinearLayout
orientation(方向)
layout_ weight(权重)
layout_ weight(权 重)的值
=0(默认值):指定多大空间就占据多大的空间
>0:将父视图中的可用空间进行分割,传越大权重就越大,占据的比例就会越大
Layout_ weight的使用场景
将布局的宽度或高度平均分成几个等份
垂直方向上占用中间所有空间或水平方向上占用中间所有空间
5.ListView的使用
1).理解
ListView是-秧用来晶示多↑个可滑幼項(tem)列表的的ViwGroup
需要使用Adapter将集合数据和毎-个ltem所対座的布局功杰活配到ListView中豆示一
湿示列表: listViewsetAdapter(adapter)
更新列表: adapter.notifyDataSetChanged()
2).使用
a. ArravAdapter : 显示简单文本列表
ArrayAdapter(Context context, intresource, T[] objects)
b. SimpleAdpater :显示复杂列表
SimpleAdapter(Context context, List<? extends Map<String, ?>> data,int resource, String[] from, int[] to) {
C. BaseAdpater (抽象的):显示复杂列表
int getCount() :得到集合数据的个数,决定了能显示多少行
0bject getI tem(int position) :根据position得到对应的数据对象
View getView(int positi on, View convertView,ViewGroup parent)
//根据position返回对应的带数据的I tem视图对象
position:下标
convertView:可复用的Item视图对象
为null;没有可复用的我们必须加载一个item的布局文件,并赋值给convertView
不为null:直接使用视图对象
后面:找到子View,找到对应的数据,设置数据
parent : ListView
d.给ListView 的Item设置监听
item的点击监听:listView. setOnI temClickListener(listener)
item的长按监听: listView. setOnI temLongClickListener (listener)
3).优化
第0层:不优化:
每次执行ketView(),都会执行: converterView=View. inflate(R. layout. xxx);
问题:效率太低,在快速滑动时会有卡顿,在数据很多时甚至会内存溢出
第1层:复用converterView
if (converterView=nul1) {
converterView = View. inflate (R. layout. xxx); //n+1}
问题:每次执行ketVi ew()都需要执行converterVi ew. findVi ewById()得到子View
第2层:使用ViewHolder,减少findViemById0的次数
Viewholder holder = null;
if(converterView==null){
converterView = View. inflate (R.1ayout. xxx);
holder = newViewHolderO:
holder. imageView =
(ImageVi ew) converterView findViewByIa(xxx);
ho1der. textView =
(TextView) converterView findVi ewById(vyy)
converterVi ew. setTag(ho1der);}e1se{
ho1der = Wi ewho1 derP converterView. getTag();}
Person pF data. get (posi ti on);
ho1 der. imaseView. setImageResource (p. getIcon());
ho1 der. textView. setText (p. getName());
static class ViewHo1der {
ImageView imageView
TextView textView }
//json: [0, 0]
问题1:对于联网获取列表数据,如果数据量太大(比如超过00000条
甚至更多),一次获取出来显示,太慢太耗流量:第四层优化
问题2: 对于联网获取列表数据,如果包含图片数据,每次都请求获取显示,太慢太耗流量: 第三层优化
第3层优化:图片三级缓存处理(LRU)
1).内存缓存优先加载,速度最快
2).本地缓存次优先加载,速度稍快
3).网络缓存最后加载,速度由网络速度决定(浪费流量)
第4层:对数据列表进行分页加载显示
1). 自己做:通过Scrol1监听
listView. setonScrolllistener (scolllistener),当到达底部时加载下一页列表数据并显示
2).使用第三方开源框架: Android-PullToRefresh 或其它
6. style和Theme
1). style :多个视图标签属性的集合
好处:复用标签属性
目标:布局文件中的视图标签
2). theme :本质也是style
好处:复用标签属性
目标:功能清单文件中整个应用/Activity I
7.练习
1).应用功能编码的基本流程
外观:布局文件,读取数据,定义Adapter,显示列表
行为:设置事件监听,并在回调就去中作出对应的响应
2).初始显示列表和更新列表
3).GridView的基础使用