android学习第二周_布局优化技巧及列表控件_学习笔记

一、10余种控件的学习

TextView:文本控件
Button:按钮控件
ImageButton:图片按钮控件
ImageView:图片控件
Radio Button/Group:单选按钮/复选按钮控件
SeekBar:滚动控件
WebView:加载网页的控件
ListView:显示列表控件
GridView:显示网格式列表控件
ScorllView:内容可滚动视图
SufaceView:绘图容器控件

二、五大布局

LinearLayout:线性布局
重要的属性:orientation:vertical /horizontal和Weight:表示所占比重
线性布局的特点:有水平和垂直、有weight
注意:在布局中资源文件必须是小写的,如果大写的话就会报错

RelativeLayout:相对布局
三种情况:
父元素的上下左右(alignParentButton)
同类元素的上下左右(toRightOf等)
和同类元素对齐(layout_below等)

其中,LinearLayout和RelativeLayout在整个布局中占有90%以上的控件

FrameLayout:帧布局 框架布局
就是一层一层的叠加

AbsoluteLayout:绝对布局
绝对布局不适合android中的布局,因为手机的屏幕尺寸不一致,所以可能导致布局不适应

TableLayout:表格布局
TableRow:表示行数
在行数中添加元素就可以构成表格式的布局
三、布局优化和技巧

UI=控件+布局
1.三个问题:
(1)布局是如何绘制的?
确定布局方式–>找到对应的控件–>根据控件属性得到布局信息
可能会产生哪些性能问题?
布局中由于层次过多可能产生性能问题
(2)如何优化?
让层次变少 怎么办
官方建议布局层次最好不要超过10层
(3)如何减少?
学会利用相关布局 相对布局就是其中一种
2.控件的组合
有些效果是通过控件之间的组合实现的
如何组合?
3.一些有用的属性
布局如何引用相同的布局
<include /> 重用布局文件
<merge /> 减少视图层级
<ViewStub /> 需要时才加载 视图的预加载,当使用的时候才加载进来
4.小技巧
不要嵌套多个使用layout_weight属性的LinearLayout
Android Iint 删除无用的资源、布局、文件、引用、类、控件
HierrarchyView 帮你分析android布局中的层级

四、ListView的使用
1.代码的书写
PhoneAdapter.java

package com.cqupt.yang.listviewactivitydemo;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;

import java.util.ArrayList;
import java.util.List;

/** * Created by Administrator on 2016/3/9. */
public class PhoneBookAdapter extends BaseAdapter{
    private Context mContext;
    private LayoutInflater mLayoutInflater;
    private List<UserInfo> mUserInfos = new ArrayList<>();

    public PhoneBookAdapter(Context context,List<UserInfo> 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) {
        //获取数据的id
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        //返回一个视图
        convertView = mLayoutInflater.inflate(R.layout.item_phone_book_firend,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.image_first);
        //和数据之间进行绑定
        nameTextView.setText(mUserInfos.get(position).getUserName());
        ageTextView.setText(String.valueOf(mUserInfos.get(position).getUserAge()));
        avatarImageView.setImageResource(R.mipmap.ic_launcher);
        return convertView;
    }

    /** * 刷新数据 * @param newUserInfos */
    public void refreshData(List<UserInfo> newUserInfos){
        mUserInfos = newUserInfos;
        notifyDataSetChanged();
    }
}

MainActivity.java

package com.cqupt.yang.listviewactivitydemo;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ListView;
import android.widget.Toast;

import java.util.ArrayList;
import java.util.List;

public class MainActivity extends Activity {

    private ListView mphonebookListView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mphonebookListView = (ListView) findViewById(R.id.list_view);
        final List<UserInfo> userInfos = new ArrayList<>();
        userInfos.add(new UserInfo("刘小明",21));
        userInfos.add(new UserInfo("张大明",22));
        userInfos.add(new UserInfo("宋小宝",23));
        userInfos.add(new UserInfo("杨某某",22));
        final PhoneBookAdapter phoneBookAdapter = new PhoneBookAdapter(MainActivity.this,userInfos);
        mphonebookListView.setAdapter(phoneBookAdapter);
        phoneBookAdapter.notifyDataSetChanged();
        mphonebookListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                if(position == 0)
                {
                    //新建另一批数据
                    //替换掉老的数据
                    //刷新listview,让它更新自己的视图
                    userInfos.clear();
                    userInfos.add(new UserInfo("我是新的数据一",12244));
                    userInfos.add(new UserInfo("我是新的数据二",12255));
                    userInfos.add(new UserInfo("我是新的数据三",124442));
                    phoneBookAdapter.refreshData(userInfos);
                }
                Toast.makeText(MainActivity.this,userInfos.get(position).getUserName()+"被点击了,怎么办",Toast.LENGTH_SHORT).show();
            }
        });
        mphonebookListView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
            @Override
            public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
                Toast.makeText(MainActivity.this,userInfos.get(position).getUserName()+"被长按了,怎么办",Toast.LENGTH_SHORT).show();
                return false;
            }
        });
    }
}

2.当Item不同时怎么办
        使用getItemViewType

五、GridView
GridView与ListView的异同点
相同点
1.继承
GridView extends AbsListView;
ListView extends AbsListView;

2.适配、方法
adapter、数据、点击事件、刷新都一样。
不同点
在布局时的样式不同

六、ScrollView
1、 用处:不是列表内容区的滚动

2、extends FrameLayout

3、 只支持垂直滚动

4、HorizontalScrollView

七、总结
    本周主要的学习内容是布局技巧和优化,开始讲了五大布局,着重点还是在LinearLayout和RelatvieLayout,其在android布局中占了95%以上,介绍了这两种布局的重要属性。然后,讲了ListView的布局,这部分是非常重要的,因为在android中很多的应用都是需要用到ListView的,这其中主要介绍了自定义Adapter,视图和数据的绑定方法。最后介绍了GridView和ScrollView,其中GridView和ListView是相似的,介绍了它们的异同点。

你可能感兴趣的:(Android学习)