一周知识总结

来源:互联网 发布:单片机sram是什么 编辑:程序博客网 时间:2024/06/05 16:35

1.Common Layout 基础(四大布局)

1.RelativeLayout(相对布局)
1)设置距parent布局的距离:align_xxxx  
2)t设置View控件位于哪个控件的位置:toStartOf,toEndOf,below,above,....
4)设置位于父View的位置:layout_alignWithParent(true,false)
5)居中显示:layout_center

2.LinearLayout(线性布局)
1)设置元素排列顺序:orientation(横向纵向排列)
2)设置权重:weight
3)设置元素的位置:layout_gravity

3.GridLayout (网格布局,以网格形式对页面元素进行规划,设置);
1)列的数量:columnCount 
2) 行的数量:rowCount
3)第几列,下标从0开始:layout_column
4)水平填充:layout_gravity
5)跨列合并行:layout_columnSpan
6)跨行合并列:layout_rowSpan


4.FrameLayout(帧布局,以层次结构默认从左上角开始布局)
1)指定元素位置,对齐方式:layout_gravity 


Common Layout 优化

1.优化view层次体系,view对象个数。
1)借助merge标签合并相同元素(例如连续两个framelayout嵌套)
a)merge在文档中必须是根元素
b)merge中定义的属性会参考父容器(parent)中相同元素的属性
2)从设计角度出发,要考虑层次体系(采用不同方式设计一个list item布局)

2.优化view加载时机(采用延迟加载策略):何时需要何时加载
a)在布局文件中借助ViewStub元素引入其它相关布局文件
b)在Android的java代码中需要时执行ViewStub对象的inflate方法加载布局

3.优化view维护时间(可以考虑布局重用)
a)借助include标签包含其它通用布局(各个页面中相同的部分)

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:tools="http://schemas.android.com/tools"    android:layout_width="match_parent"    android:layout_height="match_parent"    tools:context=".MainActivity" >    <!-- 动态包含其他布局 --><include layout="@layout/page_tilte"/></RelativeLayout><pre name="code" class="html"><?xml version="1.0" encoding="utf-8"?><TextView xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="match_parent"    android:layout_height="wrap_content"     android:layout_gravity="center_horizontal"    android:textSize="24sp"    android:gravity="center"    android:id="@+id/titleId"    android:background="#00000000"    android:textColor="#00ffffff"    ></TextView>

</pre><p></p><p></p>1.Adapter Layout 1)是一个ViewGroup(视图组,容器)2)是一个Adapter View(适配视图)2.Adapter Layout 常用类型1)ListView   (列表容器)2)GridView  (网格容器)3)Spinner     (下拉列表)4)ViewPager(分页容器)5).....................3.Adapter Layout 的构成及原理分析1)构成:a)适配容器 (Adapter Layout)b)适配器(Adapter)c)资源(Context,view,data)2)原理:对于一个Adapter Layout对象的构建,需要通过一个adapter对象,将相关资源构建成item,然后将这些item交给相关Adapter Layout对象显示。4.Adapter Layout 应用中涉及到的相关Adapter1)一个接口(ListAdapter)2)一个抽象(BaseAdapter)3)三个具体:(ArrayAdapter,SimpleAdapter,CursorAdapter)4)一个扩展:(PagerAdapter,应用于viewPager)5)一种自定义(直接或间接的继承BaseAdapter)-----------------------------------------------------------------------------------Adpater Layout 基础(ListView 布局)1.ListView1)一个View (呈现数据)2)一个ViewGroup (布局,规划view)3)一个AdapterView(数据的加载需要借助adapter)4)一个列表容器(以列表形式呈现数据)2.ListView的应用场合借助listview以列表形式呈现数据非常方便。1)微信好友列表2)QQ好友列表3)股票信息列表4)软件列表5)联系人列表6)通话记录列表7)新闻列表,....3.ListView 应用的基本实现ListView 的构成及其实现原理符合Adapter Layout.1)获得Listview对象(findViewById,new ListView(this))2)构建适配器,借助适配器对象构建列表项对象(list item)3)ListView 关联适配器(底层会借助adapter提取item)<p></p><pre name="code" class="java">//1)获得Listview对象(findViewById,new ListView(this))ListView lsv = (ListView) findViewById(R.id.lsvId);//2)构建适配器,借助适配器对象构建列表项对象(list item)ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,//Context(资源方法对象)android.R.layout.simple_list_item_1, // (resource,构建item的布局模板)new String[] { "A", "B", "C", "D" });//3)ListView 关联适配器(底层会借助adapter提取item)lsv.setAdapter(adapter);

4.ListView 相关适配应用
相关API:(ListAdapter)
1)ArrayAdapter
a)构建(参考构造方法)
b)场合(item 数据为:8种基本数据类型+string)

List<String> list=new ArrayList<String>();list.add("A");list.add("B");list.add("C");//1)获得Listview对象(findViewById,new ListView(this))ListView lsv = (ListView) findViewById(R.id.lsvId);//2)构建适配器,借助适配器对象构建列表项对象(list item)ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,//Context(资源方法对象)android.R.layout.simple_list_item_2, // (resource,构建item的布局模板)android.R.id.text1,list);
//3)ListView 关联适配器(底层会借助adapter提取item)lsv.setAdapter(adapter);


2)SimpleAdapter
a)构建(参考构造方法)
b)场合(item 数据为:Map<String,?>)

List<Map<String,Object>> list=new ArrayList<Map<String,Object>>();{ for(int i=0;i<images.length;i++){    Map<String,Object> map=new HashMap<String, Object>();    map.put("logo",images[i]);    map.put("name","City"+i);    list.add(map);//一个map对应listview中的item


3)BaseAdapter(抽象类)
a)构建(构建其子类类型对象,例如自定义适配器)
b)场合(官方给定的适配器不满足我们需求时)

new ArrayAdapter<Map<Integer,String>>(this,android.R.layout.simple_list_item_2, list){  public View getView(int position, View convertView, ViewGroup parent) {      //1.item view  View v=View.inflate(getContext(),  android.R.layout.simple_list_item_2,null);  //2.item data  Map<Integer,String> map=  getItem(position);  //3.对号入座  TextView tv1=(TextView) v.findViewById(android.R.id.text1);  TextView tv2=(TextView) v.findViewById(android.R.id.text2);  tv1.setText(map.get(1));  tv2.setText(map.get(2));  return v;}});
-----------------------------------------------------------------------------------
ListView 自定义适配的优化
1.适配器优化的目的
1)提高listview中item的显示效率.
2)改善用户体验。

2.适配器优化的方式(现阶段)

1)重用item view(饺子皮)
借助适配中convertView的值,实现item View的重用。
当listview中显示内容比较多,执行上下滑动时,滑出
的item会赋值给convertview.
   
FAQ
a)convertView 是什么?(列表项对象)
b)convertView 何时有值?(滑动listview时)
c)convertView 由谁赋值?(由底层系统赋值)
   
2)减少item view中子元素的查找次数
在getView方法中,对于item view而言假如需要设置其子元素的值,通常需要调用view的findViewById方法先找到对应的子元素。而查找的过程是一个耗时操作,所以我们要减少这个查找次数。在android中给出的解决方案通常是定义一个类(例如ViewHolder)借助此类中的属性记录item view中每个子元素的位置。

public View getView(int position, View convertView, ViewGroup parent) {//1.构建item view对象(饺子皮):参考mResource资源构建View v=null;ViewHolder vHolder=null;if(convertView==null){//listview页面初始化时,convertview的值是null的//inflate 方法的具体返回值类型对象由mResource的根元素决定//v=View.inflate(mContext, mResource, null);v=LayoutInflater.from(getContext()).inflate(mResource, parent,false);vHolder=new ViewHolder();//类似座位表(借助此对象记录item view中子元素的位置)//查找item view中的子元素,并在viewHolder中进行记录vHolder.iv=(ImageView) v.findViewById(R.id.imgId);vHolder.tv=(TextView) v.findViewById(R.id.text01);v.setTag(vHolder);//一个item view对象绑定一个viewHolder对象}else{v=convertView;//重用convertview,以减少item view的构建次数vHolder=(ViewHolder)v.getTag();}//2.获得item 数据对象(饺子馅)City c=(City)getItem(position);//3.对号入座(将饺子馅放到饺子皮对应位置)//3.1设置itemview 中子元素的值vHolder.iv.setImageResource(c.getLogo());vHolder.tv.setText(c.getName());return v;//包好的饺子(底层会将此对象添加到listview)}class ViewHolder{//view对象的持有者ImageView iv;TextView tv;}
ListView 的事件处理

1.ListView 事件类型
1)点击事件(短按,长按事件)

lsv.setOnItemClickListener(new OnItemClickListener() {    //回调函数//点击listview中的某个item时会自动执行此方法@Override    public void onItemClick(    AdapterView<?> parent,//ListView     View view, //列表项对象(list item)    int position, //item 的位置    long id) {//item id,现阶段与item position相同    //根据位置获得对应的item对象对应的数据//底层会调用适配器的getItem方法//此方法的返回值由getItem方法的返回值决定City city=(City)//parent.getItemAtPosition(position);Toast.makeText(getApplicationContext(),//Contextcity.getName(),//CharSequence0//duration).show();//显示信息    }});
public boolean onItemLongClick(<span style="white-space:pre"></span>AdapterView<?> parent,View view,int position, long id) {<span style="white-space:pre"></span>Toast.makeText(this, "onItemLongClick",0).show();<span style="white-space:pre"></span>return true;<span style="white-space:pre"></span>//返回值表示此事件是否已经处理结束;<span style="white-space:pre"></span>//假如事件已经处理结束,且其它事件不要则进行处理,则返回true<span style="white-space:pre"></span>    //返回false时,假如listview中还有其它事件,其它事件会继续执行


2)滚动事件(listview滚动时要进行如何处理)
/**滚动状态发生变化时执行*/<span></span>@Override<span></span>public void onScrollStateChanged(AbsListView view, int scrollState) {<span></span><span></span>}<span></span>/**滚动时执行此方法*/<span></span>@Override<span></span>public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {<span></span><span></span>}

2.ListView 事件监听器(观察者对象)
1)OnItemClickListener
2)OnItemLongClickListener
3)OnScrollListener

3.ListView 事件处理


1)添加事件监听器(关注添加方式及事件类型)
2)回调事件处理方法(属于监听器对象):关注业务
--------------------------------------------------------------------------------------------------------------------

ListView 中item的选择设置


1.ListView选择模式的设置(setChoiceModel(int model))
1)没选CHOICE_MODE_NONE
2)单选CHOICE_MODE_SINGLE
3)多选CHOICE_MODE_MULTIPLE

new ArrayAdapter<String>(this,    android.R.layout.simple_list_item_checked, list){    @Override    public View getView(int position, View convertView, ViewGroup parent) {    View v=super.getView(position, convertView, parent);    int checked=((ListView)parent)    .getCheckedItemPosition();    if(checked==position){    v.setBackgroundColor(Color.GRAY);    }else{    v.setBackgroundColor(Color.WHITE);    }    return v;    }    };



2.有选择性的指定适配器关联的item布局
android.R.layout.simple_list_item_checked

3.有选择性的设置点击过的内容高亮显示
1)添加监听器(OnItemClickListener)
2)每次点击刷新ListView(adapter.notifyDataSetChanged)
3)重写适配器的getView,在此方法中获得选中的
item的位置,根据位置判定是否让此view高亮显示。


4.有选择性对选中内容进行删除
1)获得选中的内容(SparseBooleanArray)
2)从数据集中删除选中内容(list.removeAll(...))
3)通知更新(ListView进行刷新)
4)清除选中选项(listview.clearChoices())

-----------------------------------------------------------------------------------------

ListView 中内容的分组(分块)


1.应用场合
1)数据量比较小,且是一次加载.
2)数据已经有序(一般是升序)


例如:
1)手机联系人
2)汽车品牌
3).....


2.具体实现


1)对数据进行排序(借助Collections的sort方法)
2)每个item都显示key(A,B,C)
3)同一个分块中第一个item显示key,其它item隐藏key
3.1)根据位置获得当前模块(分组)的名称(key)
int getSectionForPosition(int position){}
此方法的返回值为块名称的ASCII;
3.2)获得此模块中位置(position)最小的值
int getPositionForSection(int section){}
此方法参数为块名称的ASCII码值
3.3)显示模块中最小位置的item中的key,其它key隐藏

/**根据位置获得当前模块(分组)的名称(key) * @return 此方法的返回值为块名称的ASCII; * */public int getSectionForPosition(int position){return ((City)getItem(position)).getKey().toUpperCase().charAt(0);}public int getPositionForSection(int section){for(int i=0;i<getCount();i++){//i为所有位置int sec=getSectionForPosition(i);if(sec==section)return i;//此位置为最小位置}return -1;}
------------------------------------------------------------------------------------------------------------------
ListView 分块中的右侧导航

1.右侧导航应用场合
构建于分块显示的基础上,希望能够快速定位某个模块。

2.右侧导航实现
1)在页面右侧再添加一个ListView
2)点击导航ListView中的item时,能够快速定位某个模块。
3)右侧列表点击过后高亮显示?
a)设置listview的选择模式
b)重写适配器的getview方法,判定位置的选中状态
c)点击item时刷新列表

3左侧列表在滑动时,右侧列表对应位置高显示
a)左侧列表添加滚动监听器
b)在listview滚动状态发生变化时,设置右侧列表高亮显示
b.1)获得左侧列表第一个item显示的位置
b.2)获得此位置对应的块(section)名称
b.3)获得此块名称在右侧列表中的位置
b.4)设置右侧列表此位置的item为选中状态
b.5)刷新右侧列表

public void onScrollStateChanged(AbsListView view, int scrollState) {   if(scrollState==   OnScrollListener.SCROLL_STATE_IDLE){   //获得第一个显示的item位置   int pos=view.getFirstVisiblePosition();   //获得此位置的块名称   char section=(char)//'A','B'   startAdapter.getSectionForPosition(pos);   //查找此块对应的右侧列表的位置   int rightPos=   chars.indexOf(String.valueOf(section));   Log.i("TAG", "rightPos="+rightPos);   //设置右侧对应位置选中   endLsv.setItemChecked(rightPos, true);   //刷新右侧列表   endAdapter.notifyDataSetChanged();   }}
protected void onActivityResult(int requestCode, int resultCode, Intent data) {<span style="white-space:pre"></span>if(requestCode==100&&resultCode==200){<span style="white-space:pre"></span>String name=data.getStringExtra("nameKey");<span style="white-space:pre"></span>MenuItem.setTitle(name);<span style="white-space:pre"></span>}<span style="white-space:pre"></span>}
<span style="white-space:pre"></span>public boolean onOptionsItemSelected(android.view.MenuItem item) {<span style="white-space:pre"></span>   //判定点击的菜单项是否是切换城市<span style="white-space:pre"></span>   //构建一个意图对象<span style="white-space:pre"></span>   //启动Activity<span style="white-space:pre"></span>   //startActivity(intent);<span style="white-space:pre"></span>if(item.getItemId()==R.id.cityId){<span style="white-space:pre"></span>Intent intent = new Intent(this,CityActivity.class);<span style="white-space:pre"></span>startActivityForResult(intent,100);<span style="white-space:pre"></span>}<span style="white-space:pre"></span><span style="white-space:pre"></span>return super.onOptionsItemSelected(item);<span style="white-space:pre"></span>}<span style="white-space:pre"></span>protected void onActivityResult(int requestCode, int resultCode, Intent data) {<span style="white-space:pre"></span>if(requestCode==100&&resultCode==200){<span style="white-space:pre"></span>String name=data.getStringExtra("nameKey");<span style="white-space:pre"></span>MenuItem.setTitle(name);<span style="white-space:pre"></span>}<span style="white-space:pre"></span>}
-------------------------------------------------------------------------------------------------------------------
ListView 的扩展对象ExpandableListView的应用

1.ExpandableListView 是什么
一个可分组的ListView


2.ExpandableListView 的应用场合
ExpandableListView 对象能够对列表分组中的
内容进行展开或收起,类似QQ中的我的好友,
我的同学,我的家人,....

3.ExpandableListView 应用的实现
1)获得ExpandableListView对象(应该在布局文件声明)
2)构建适配器对象(继承BaseExpandableListAdapter)
3)ExpandableListView关联适配器对象
4)有选择性的添加监听器(Listener)

 String groups[]={"A","B","C"};String childs[][]={{"A1","A2","A3"},{"B1","B2"},{"C1","C2"}
setContentView(R.layout.activity_main);<span style="white-space:pre"></span>    //1.获得ExpandableListView<span style="white-space:pre"></span> ExpandableListView lsv=<span style="white-space:pre"></span> (ExpandableListView) <span style="white-space:pre"></span>     findViewById(R.id.lsvId);<span style="white-space:pre"></span>//2.构建适配器对象<span style="white-space:pre"></span> ExpandableListAdapter adapter=<span style="white-space:pre"></span> new ExpAdapter();<span style="white-space:pre"></span>//3.关联适配器<span style="white-space:pre"></span> lsv.setAdapter(adapter);
lsv.setOnChildClickListener(new OnChildClickListener() {<span style="white-space:pre"></span>@Override<span style="white-space:pre"></span>public boolean onChildClick(ExpandableListView parent, View v, int groupPosition, int childPosition, long id) {<span style="white-space:pre"></span>Toast.makeText(getApplicationContext(),<span style="white-space:pre"></span>childs[groupPosition][childPosition], 0).show();<span style="white-space:pre"></span>return true;<span style="white-space:pre"></span>}<span style="white-space:pre"></span>});<span style="white-space:pre"></span>//默认展开第0个分组<span style="white-space:pre"></span>lsv.expandGroup(0); 
class ExpAdapter extends BaseExpandableListAdapter{<span style="white-space:pre"></span>@Override<span style="white-space:pre"></span>public int getGroupCount() {<span style="white-space:pre"></span>return groups.length;<span style="white-space:pre"></span>}<span style="white-space:pre"></span>@Override<span style="white-space:pre"></span>public int getChildrenCount(int groupPosition) {<span style="white-space:pre"></span>return childs[groupPosition].length;<span style="white-space:pre"></span>}        //getItem<span style="white-space:pre"></span>@Override<span style="white-space:pre"></span>public Object getGroup(int groupPosition) {<span style="white-space:pre"></span>return groups[groupPosition];<span style="white-space:pre"></span>}<span style="white-space:pre"></span>@Override<span style="white-space:pre"></span>public Object getChild(int groupPosition, int childPosition) {<span style="white-space:pre"></span>return childs[groupPosition][childPosition];<span style="white-space:pre"></span>}        //getItemId<span style="white-space:pre"></span>@Override<span style="white-space:pre"></span>public long getGroupId(int groupPosition) {<span style="white-space:pre"></span>return groupPosition;<span style="white-space:pre"></span>}<span style="white-space:pre"></span>@Override<span style="white-space:pre"></span>public long getChildId(int groupPosition, int childPosition) {<span style="white-space:pre"></span>return childPosition;<span style="white-space:pre"></span>}<span style="white-space:pre"></span>/**listview中的item的id是否是稳定的*/<span style="white-space:pre"></span>@Override<span style="white-space:pre"></span>public boolean hasStableIds() {<span style="white-space:pre"></span>return false;//表示不稳定<span style="white-space:pre"></span>}
以上重写方法!

以下为包饺子

public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView,ViewGroup parent) {//1.饺子皮View v=View.inflate(MainActivity.this,android.R.layout.simple_list_item_1,null);//2.饺子馅String item=(String)getChild(groupPosition, childPosition);//3.包起来((TextView)v).setText(item);return v;}
public boolean isChildSelectable(int groupPosition, int childPosition) {<span style="white-space:pre"></span>// TODO Auto-generated method stub<span style="white-space:pre"></span>return true;//表示子元素可以点击或选择<span style="white-space:pre"></span>}<span style="white-space:pre"></span>}

-------------------------------------------------------
GridView 的应用

1.GridView 是什么
0)View
1)ViewGroup
2)AdapterView

2.GridView 的应用场合
GridView会以网格的形式显示ITEM对象,例如
1)手机相册
2)支付宝首页

3.GridView 的构建及原理(类似ListView)
4.GridView 的应用实现(以网格显示A,B,C,D,E,F)
1)获得GridView对象(findViewById)
2)构建适配器(ArrayAdapter)
3)关联适配器(setAdapter)

GridView 常用属性

1)列的数量:android:numColumns="2"
2)水平间隙:android:horizontalSpacing="1dp"
3)垂直间隙:android:verticalSpacing="1dp"
4)列的宽度:android:columnWidth="60dp"
5)间隙模式:android:stretchMode="columnWidth"

------------------------------------------------------
Spinner 

1.Spinner 是什么
0)View
1)ViewGroup
2)AdpateView
3)下拉列表

2.Spinner 应用场合

以下拉列表形式显示多个item时,可以考虑使用Spinner.
例如:
1)选择学历
2)选择颜色

3.Spinner 的构成及实现原理
类似ListView,GridView,...

4.Spinner 应用的简单实现
1)获得Spinner对象
2)构建适配器(ArrayAdapter)
3)关联适配器(setAdapter)


其它相关方法
1)setDropDownViewResource(借助此方法设置下拉列表布局)
2)getDropDownView(此方法在显示下拉列表时自动调用)
3)getSelectedItem(借助此方法获得选中的item)
4)....
5.Spinner 相关监听器
1)OnItemSelectedListener
2).......
------------------------------------------------------
ViewPager 

1.ViewPager 是什么
1)View
2)ViewGroup

2.ViewPager 应用场合
以分页形式显示Item时,可以考虑使用此对象。
例如:
1)新手指导页面
2)系统广告条
3)主页面内容左右滑动时的切换

3.ViewPager 对象的构成及实现原理
1)ViewPager (Item:item view+data)
2)PagerAdapter (ViewPager借助此适配器加载数据)

4.ViewPager 的应用及相关实现
1)获得ViewPager对象(android.support.v4.view.ViewPager)
2)构建PagerAdapter对象(抽象类型,重写四个方法)
3)关联适配器对象(setAdapter)

ViewPager对象在显示数据时,会借助PagerAdapter
将数据首先要构建成Item,且在初始化时,默认会借助适配器的instantiateItem这个方法构建两个item,在ViewPager对象滑动时可能还会继续构建新的item,同时也会有一些通过destroyItem方法进行销毁。

ViewPager vp = (ViewPager) findViewById(R.id.vPagerId);PagerAdapter pa = new PagerAdapter() {@Overridepublic boolean isViewFromObject(View arg0, Object arg1) {return arg0 == arg1;}@Overridepublic int getCount() {return 7;}@Overridepublic Object instantiateItem(ViewGroup container, int position) {ImageView iv = map.get(position);if(iv == null){iv = new ImageView(MainActivity.this);iv.setImageResource(imgs[position]);map.put(position, iv);}//ImageView iv = new ImageView(MainActivity.this);container.addView(iv);return iv;}@Overridepublic void destroyItem(ViewGroup container, int position, Object object) {container.removeView((View)object);}<span style="white-space:pre"></span>};@Override<span style="white-space:pre"></span>public void destroyItem(ViewGroup container, int position, Object object) {<span style="white-space:pre"></span>container.removeView((View)object);<span style="white-space:pre"></span>}<span style="white-space:pre"></span><span style="white-space:pre"></span>};<span style="white-space:pre"></span>vp.setAdapter(pa);



PagerAdapter 相关方法说明:
1)getCount():返回ViewPapger最多显示的item的个数
2)isViewFromObject(View arg0,Object arg1):

判定instantiateItem返回的key对应的view是否是容器(ViewPager)中添加的view,此方法如何实现由instantiateItem方法的返回值决定。


3)instantiateItem(ViewGroup container, int position)
构建Item时会执行此方法,此方法用于构建item,
并将构建的item添加到viewPager容器,然后返回
一个与此item对应的一个key
  
4)destroyItem(ViewGroup container, int position, Object object)
销毁item时会执行此方法,此方法中通常要从viewpager
中移除对应key的item,key为参数中的object,它的值与
instantiateItem方法返回的值相同。

0 0
原创粉丝点击