安卓----第二章(布局技巧与列表控件)

2016-07-27  本文已影响91人  timber_wu

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的应用

不是列表的内容区的滚动(

只支持一种方向上的滚动----默认为垂直)

上一篇下一篇

猜你喜欢

热点阅读