Common Layout总结
1.Common Layout基础
1)RelativeLayout (相对布局)
2)LinearLayout (线性布局)
3)GridLayout (网格布局)
4)FrameLayout(帧布局)
2.Common Layout优化
1)优化继承体系(减少层次结构)
2)优化对象个数(merge)
例如:借助merge标签实现相同布局的合并
1. <merge xmlns:android="http://schemas.android.com/apk/res/android">
2. </merge>
3)优化加载时机(ViewStub)
1. <!-- 借助此标签实现元素的延迟加载 -->
2. <ViewStub
3. android:id="@+id/stub_id"
4. android:inflatedId="@+id/tv01"
5. android:layout="@layout/layout_tv_1"
6. android:layout_width="match_parent"
7. android:layout_height="wrap_content"
8. />
4)优化布局重用(include)
例如:借助include标签导入共用布局
1. <include layout="@layout/top_title_layout_1"/>
3.Common Layout扩展
1)ScrollView (垂直滚动)
相关方法:append();
2)HorizontalScrollView(水平滚动)
具体实现步骤:
1.获得线性布局对象
2.构建线性布局参数对象
LayoutParams params=new LayoutParams(
LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT);
params.rightMargin=5;//设置右边距params.gravity=Gravity.CENTER_VERTICAL;//设置垂直居中
3.在线性布局添加几个TextView
a)setText();
b)setVisibility(View.GONE);//设置隐藏且不占空间
c)setVisibility(View.INVISIBLE);//设置隐藏且占空间
d)setTextColor(Color.WHITE);
e)setTextColor(Color.parseColor("#ffffffff"));
4.添加触摸事件
setOnTouchListener();
//获得事件类型
event.getAction()==MotionEvent.ACTION_DOWN5.
设置TextView对象的LayoutParams(使用哪个由布局决定)
setLayoutParams(params);
getChildCount();//获得子元素个数
getChildAt(0).setVisibility(View.VISIBLE);
indexOfChild();
说明无论使用哪种布局,在内部都需要嵌套一个LinearLayout对象。
ScrollView 相关布局:
<ScrollView
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:orientation="vertical">
<TextView
android:id="@+id/text01"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="30sp"/>
</LinearLayout>
</ScrollView>
3.)TextSwitcher(文本切换器)
具体实现步骤:
1)构建或者获得TextSwitcher对象
2)设置View工厂(setFactory)
a)setFactory(....)
3)设置动画Animation(了解)
a)setInAnimation(AnimationUtils.loadAnimation(this,android.R.anim.fade_in));
4)设置当前view内容
a)setCurrentText();
b)setText(...)
4)ImagerSwitcher(图片切换器)
ImageSwitcher 主要用于实现图片的切换显示。
具体实现步骤:
1)构建或者获得ImageSwitcher对象
2)设置View工厂
setFactory();
3)设置动画Animation(了解)
a)setInAnimation(AnimationUtils.loadAnimation(this,android.R.anim.slide_in_left));
b)setOutAnimation(AnimationUtils.loadAnimation(this,android.R.anim.slide_out_right));
4)显示图片
setImageResource();
setScaleType(ScaleType.CENTER);
Adapter Layout (适配布局)
1.Adapter Layout 是什么?
这些Layout对象在显示数据需要借助adapter加载数据,并将数据构建成相应的item,然后交给adapter layout显示。
1)ViewGroup(容器)
2)View
3)Adapter View
2.Adapter Layout 应用场合?
由具体的Adapter Layout对象决定:常用的Adapter Layout对象有:
1)ListView (以列表形式显示数据)
2)GridView (以网格形式显示数据)
3)Spinner (以下拉列表显示数据)
4)ViewPager(以分页形式显示数据)
3.Adapter Layout的构成及实现原理
1)构建Adapter View对象
2)构建Adapter
3)关联Adapter
Adapter Layout (ListView)
1.ListView 是什么?
1)AdapterView (适配视图)
2)ViewGroup(列表容器)
2.ListView 对象应用场合?
ListView要以列表形式显示数据,例如:
1)微信好友列表
2)QQ好友列表
3)软件列表
4)股票列表
5)......
3.ListView 应用的基本实现?
1.ListView 应用实现的基本步骤
1.构建ListView对象
2.准备item view,item数据
3.构建Adapter,组装数据,构建item.
4.Listview 关联adapter.
Adapter 总结
1.Adapter 基础
1.ArrayAdapter (数据:数组,List);
2.SimpleAdapter(数据:List<? extends Map<String,?>>)
SimpleAdapter adapter=new SimpleAdapter(this,
brands,//data(List<? Map<String,?>>)
R.layout.list_item_02, //resource (item view 模板)
new String[]{"logo","name"},//map中的key
new int[]{R.id.imageView1,R.id.textView1});//resource中的viewId
3.SimpleCursorAdapter(数据集为一个Cursor对象)
4.BaseAdapter(抽象类,有部分抽象方法)
5.ListAdapter(接口,标准)
2.Adapter 扩展
1)直接继承BaseAdapter
2)继承BaseAdapter的子类类型(例如继承ArrayAdapter)
3.Adapter 优化
1)优化目的:提高listview的显示效率
2)优化方式:
1)重用getView方法中的convertView.
a)convertView初始值为null
b)convertView何时会有值?(listView滑动时)
c)convertView重用的目的是减少itemView的构建次数
2)减少getView方法中的findViewById
方法的执行次数(策略是借助ViewHolder对象对itemview中的子元素的位置进行记录。);
ListView 总结
1. ListView 事件处理
1)item 的点击事件
a)OnItemClickListener
b)OnItemLongClickListener
2)item 子元素的点击事件
c)建议重写getView,在此方法中对item子元素添加相应事件,并对当前位置进行绑定(setTag);
相关方法总结:
a)setTag();
b)getTag();
c)parent.getItemAtPosition(position);//获得点击的item,此方法的返回值类型由adapter的getItem方法决定
d)adapter.notifyDataSetChanged();//更新listview,当执行此动作时,listview中的数据会重新加载(会重新调用adapter的getView)
2. ListView 中item的选择模式
选择模式的设置
1)单选模式:setChoiceMode(ListView.CHOICE_MODE_SINGLE)
2)多选模式:setChoiceMode(ListView.CHOICE_MODE_MULTIPLE)
案例:点击item实现item的选择,
并且要求高亮显示。
1)首先设置选择模式
2)获得选中的item的位置
3)刷新listview,在adapter的
getView方法中根据位置设定item
的背景。
相关API及方法总结:
1)ListView(AbsListView,AdapterView,)
a)setAdapter()
b)getAdapter()
c)setOnItemClickListener()
d)setChoiceMode()
e)getCheckedItemPosition()
f)getCheckedItemPositions()
g)getItemAtPosition(...);
2)Adapter(ListAdapter,BaseAdapter,ArrayAdapter,.....)
a)notifyDataSetChanged();
3.ListView 排序
1)Collections.sort(....)
/**对数据按名字的第一个字母进行排序*/
Collections.sort(citys, new Comparator<City>() {
public int compare(City lhs, City rhs) {
return lhs.getNameKey().compareTo(rhs.getNameKey());
};
});
2)notityDataSetChanged(...)
2.Listview 分块
1)应用场合(数据量小,已有序)
2)应用实现方式
1)对元素进行排序
2)每个item上都添加一个Textview显示首字母
3)隐藏部分item对象的首字母的显示(在adapter的getview方法)
a)首先获得当前位置的section(块)的ASCII
getItem(position).getNameKey().toUpperCase().charAt(0);
b)获得此section在listview中的最小位置
c)对非最小位置的section进行隐藏
setVisibility(View.GONE);
4.Listview 导航
1)应用场合(分块显示的场合)
2)应用实现方式:
1)在页面右侧中添加一个listview
2)实现右侧listview中数据的显示
3)点击右侧listview列表时定位具体分块
3)实现步骤:
1.获得listview
2.设置选择模式
3.构建适配器
4.关联适配器
5.添加监听器
相关API及方法总结:
a)getCheckedItemPosition();
b)getItemAtPosition(position);
c)charAt(0);
d)setSelectionFromTop(minPos,0);//设置此列表的顶端显示为section的最小位置,0表示没有偏移量
e)采用此方式启动activity,可以获得回传的数据,可以重写onActivityResult来接收回传的数据
startActivityForResult(new Intent(this,CityActivity.class),//表示意图
100//请求码
f)setResult(200, intent);//设置回传数据及响应码
g)intent.putExtra("cityName",city.getName());(封装数据)
h)intent.getStringExtra("cityName");//获得回传的数据
分块与导航显示效果:
5.Listview 扩展(ExpandableListView)
1)应用场合(分组显示,实现展开,收起操作)
2)具体实现
1)获得ExpandableListView对象
2)构建适配器(Adapter)对象
3)关联Adapter(ExpandableListAdapter)
4)监听item的点击事件
相关API:
1)ExpandableListView
2)ExpandableListAdapter
3)BaseExpandableListAdapter
4)SimpleExpandableListAdapter
相关方法:
1)setOnChildClickListener(....)
2)expandGroup(int index)
3)collapseGroup(...)
4)isGroupExpanded(....)
5).......
6.Spinner 对象(下拉列表)
1)应用场合(下拉列表形式显示数据,例如选择学历)
2)应用实现
11)获得Spinner对象
2)构建适配器对象
3)关联适配器对象
4)添加监听器
案例:城市信息联动
Spinner 相关方法:
1)getSelectedItem();
2)setOnItemSelectedListener(...)
3)childList.addAll(Arrays.asList(childs[position]));
GridView 总结
1.GridView 应用场合(网格形式显示数据,例如:支付宝首页,微信支付)
2.GridView 应用实现
1)获得GridView对象
2)构建适配器
3)关联适配器
4)添加监听事件
3.GridView 常用属性?
android:numColumns="2"
android:verticalSpacing="1dp"
android:horizontalSpacing="1dp"
android:columnWidth="100dp"
android:stretchMode="columnWidth"
4.GridView item 的选择器的设置?
1)选择器应用场合?
一般与view对象的状态结合使用,大多数是应用于view背景或字体颜色的设置
2)选择器的创建?
a)目录:res/drawable/selector.xml
b)访问:@drawable/选择器的名称
c)构建:
<selector xmlns:android="http://schemas.android.com/apk/res/android" >
<item android:drawable="@color/huise"
android:state_pressed="true"/>
<item android:drawable="@color/white"
android:state_pressed="false"/>
</selector>
<selector xmlns:android="http://schemas.android.com/apk/res/android" >
<item android:color="#ff669900"
android:state_pressed="true"/>
<item android:color="#ff000000"
android:state_pressed="false"/>
</selector>
ViewPager总结
1.ViewPager 的应用场合(分页形式显示数据例如:广告条,小说分页显示,系统新手指导)
2.ViewPager 应用的实现
1)获得ViewPager对象(android.support.v4.view.ViewPager)
2)构建适配器对象
3)关联适配器对象
4)添加监听器
setOnPageChangeListener();
案例:
1)系统广告(banner)条的实现
2)系统新手指导页面的实现?
扩展:开始体验Button选择器的设置
1)selector (引入两个shape)
a)res/drawable/selector_01.xml
2)shape(通过此对象绘制图形)
a)res/drawable/shape_01.xml
b)res/drawable/shape_02.xml
<shape xmlns:android="http://schemas.android.com/apk/res/android" >
<!-- 借助此元素定义view的颜色 -->
<solid android:color="#ff669900"/>
<!-- 借助此元素对view进行角度设置 -->
<corners android:radius="8dp" />
</shape>
扩展:页面指示器的设置
1)添加页面指示器
a)定义一个线性布局
b)在线性布局动态几个小圆点
b.1)构建ImageView对象
b.2)设置ImageView对象选择器
v.setBackgroundRecource()
2)页面滑动时动态修改页面指示器中
小圆点的状态(例如enable状态)
view.setEnable(flag) //修改指示器状态
<selector xmlns:android="http://schemas.android.com/apk/res/android" >
<item android:drawable="@drawable/p02" android:state_enabled="true"/>
<item android:drawable="@drawable/p01" android:state_enabled="false"/>
</selector>
3)点击页面指示器中小圆点时切换到
不同页面:viewPager.setCurrentItem(pos);