安卓----第二章(布局技巧与列表控件)
1.五大布局
android中的布局包括:LinearLayout(线性布局)、RelativeLayout(相对布局)、FrameLayout(框架布局)、AbsoluteLayout(绝对布局)、TableLayout(表格布局),在实际中主要实用的是前面三种。
1.1LinearLayout(线性布局)
LinearLayout方法全解特点:
线性方向上依次排列
一些需要注意的点:
weight(权重)的解释:按比例划分水平方向:将涉及到的View的android:width属性设置为0dp,然后设置为android weight属性设置比例即可;类推,竖直方向,只需设android:height为0dp,然后设weight属性!
当 android:orientation="vertical" 时, 只有水平方向的设置才起作用,垂直方向的设置不起作用。 即:left,right,center_horizontal 是生效的。 当 android:orientation="horizontal" 时, 只有垂直方向的设置才起作用,水平方向的设置不起作用。 即:top,bottom,center_vertical 是生效的。
1.2RealtiveLayout(相对布局)
RelativeLayout方法图一些需要注意的点:
margin与padding的区别
初学者对于这两个属性可能会有一点混淆,这里区分下: 首先margin代表的是偏移,比如marginleft = "5dp"表示组件离容器左边缘偏移5dp; 而padding代表的则是填充,而填充的对象针对的是组件中的元素,比如TextView中的文字 比如为TextView设置paddingleft = "5dp",则是在组件里的元素的左边填充5dp的空间! margin针对的是容器中的组件,而padding针对的是组件中的元素,要区分开来!
1.3FrameLayout(框架布局)
又称为帧布局,该布局直接在屏幕上开辟出一块空白的区域,当我们往里面添加控件的时候,会默认把他们放到这块区域的左上角,而这种布局方式却没有任何的定位方式,所以它应用的场景并不多;帧布局的大小由控件中最大的子控件决定,如果控件的大小一样大的话,那么同一时刻就只能看到最上面的那个组件!后续添加的控件会覆盖前一个!虽然默认会将控件放置在左上角,但是我们也可以通过layout_gravity属性,指定到其他的位置。
1.3.1常用属性:
android:foreground:*设置改帧布局容器的前景图像
android:foregroundGravity:设置前景图像显示的位置
1.4AbsoluteLayout(绝对布局)---已被弃用
1.5TableLayout(表格布局)
方法图
需要注意的点:
列数是从0开始的。
每一个<TableRow> </TableRow>即为一行
1.6布局技巧与优化
1.6.1布局的优化:
布局的结构要清晰
嵌套的层数需要控制(小于10层)
减少层数(使用相对布局)
1.6.2布局的技巧
<include/>重用布局文件
<merge/>减少试图层数
<ViewStub/>需要时才加载
不要嵌套多个使用layout_weight属性的LinearLayout
Android lint---优化代码、查找没用到的资源、查找错误
HierarchyViewer---优化布局设计
2无比重要的ListView
ListView是一种以列表形式展示具体内容,并且能够根据数据的长度自适应显示的控件。一个listView通常有两个职责:一是将数据填充到布局,二是处理用户的选择点击操作等。
构建ListView的元素:
- ListView中每一列的view。
- 填入View的数据,如字符串、图片或组件。
- 连接数据与ListView的适配器。
2.1Adapter
适配器是一个连接数据和AdapterView(ListView就是一个典型的AdapterView,后面还会学习其他的)的桥梁,通过它能有效地实现数据与AdapterView的分离设置,使AdapterView与数据的绑定更加简便,修改更加方便.
适配器包括:ArrayAdapter、SimpleAdapter、SimpleCursorAdapter、BaseAdapter等。(各种Adapter只不过是转换的方式和能力不一样而已)
2.1.1BaseAdapter
BaseAdapter的方法图使用BaseAdapter必须写一个类继承它,同时BaseAdapter是一个抽象类,继承它必须实现它的方法。BaseAdapter的灵活性就在于它要重写很多方法,看一下有哪些方法,如上图所示为继承自BaseAdapter的SpeechListAdapter所实现的方法,其中最重要的即为getView()方法。
当系统开始绘制ListView的时候,首先调用getCount()方法。得到它的返回值,即ListView的长度。然后系统调用getView()方法,根据这个长度逐一绘制ListView的每一行。也就是说,如果让getCount()返回1,那么只显示一行。而getItem()和getItemId()则在需要处理和取得Adapter中的数据时调用。
public class PhoneBookAdapter extends BaseAdapter {
private Context mContext;
private LayoutInflater mLayoutInflater;
private ListmUserInfos= new ArrayList<>();
public PhoneBookAdapter(Context context, List userInfos) {
mContext = context;
mUserInfos = userInfos;
mLayoutInflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
@Override
public int getCount() {
// 有多少条数据
return mUserInfos.size();
}
@Override
public Object getItem(int position) {
// 返回某一条数据对象
return mUserInfos.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// 返回一个视图
if(converView==null){
convertView = mLayoutInflater.inflate(R.layout.item_phone_book_friend, null);
// 获取控件
TextView nameTextView = (TextView) convertView.findViewById(R.id.name_text_view);
TextView ageTextView = (TextView) convertView.findViewById(R.id.age_text_view);
ImageView avatarImageView = (ImageView) convertView.findViewById(R.id.avatar_image_view);
// 和数据之间进行绑定
nameTextView.setText(mUserInfos.get(position).getUserName());
ageTextView.setText(String.valueOf(mUserInfos.get(position).getAge()));
avatarImageView.setImageResource(R.drawable.ic_launcher);
return convertView;
}
在该构造器中通过使用判断convertView是否为空来对性能进行优化。
2.2在JAVA文件中调用Adapter
public class ListViewDemoActivity extends Activity {
private ListView mPhoneBookListView;
private ListmUserInfos;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_listview_demo);
mPhoneBookListView = (ListView) findViewById(R.id.list_view);
mUserInfos = new ArrayList<>();
mUserInfos.add(new UserInfo("刘小明", 21));
mUserInfos.add(new UserInfo("张大伟", 22));
PhoneBookAdapter phoneBookAdapter = new PhoneBookAdapter(ListViewDemoActivity.this,mUserInfos);
mPhoneBookListView.setAdapter(phoneBookAdapter);
}
}
2.3ListView的点击事件
调用setOnItemClickListener()方法来为ListView注册一个监听器,当ListView中的任何一个子项被点击时就会回调onItemClick()方法。
3GridView和ScrollView
3.1GridView与ListView的相似与区别
相似之处:
GridView extends AbsListView
LIstView extends AbsListView
adapter、数据、点击事件、刷新都一样
不同之处:
样式(GridView为宫格式)
3.2GridView应用的地方
微信表情选择、相册选择、头像
3.3ScrollView的应用
不是列表的内容区的滚动(
只支持一种方向上的滚动----默认为垂直)