一、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是相似的,介绍了它们的异同点。