美文网首页
安卓----第二章(布局技巧与列表控件)

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

作者: timber_wu | 来源:发表于2016-07-27 08:48 被阅读91次

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

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

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

    相关文章

      网友评论

          本文标题:安卓----第二章(布局技巧与列表控件)

          本文链接:https://www.haomeiwen.com/subject/jzznjttx.html