Adapter

关于各种Adapter
------------------------------------------
1) ArrayAdapter:只能在Item中显示1种数据
2) SimpleAdapter: 只能显示固定的1个模板,以至于显示的每个Item的外观必须是一模一样的
3) BaseAdapter:完全自由的定制的Adapter
ListView+Adapter 开发流程
-----------------------------------------
1) 在activity_main.xml中添加ListView控件,至少配置id、layout_width、layout_height属性,除此以外,ListView没有必要属性
2) 在MainActivity.java中,创建数据源List<?>,并在其中添加各项数据(Ps:在使用ArrayAdapter时,数据的集合都应该是List<String>类型的)
3) 在res\layout下,创建新的XML文件,根节点直接选择TextView
4) 在MainActivity.java中,声明并创建ArrayAdapter<String>,构造方法中应用R.layout.xxxx(第3步骤的文件)和数据源
5) 初始化ListView控件的对象,调用ListView的setAdapter()方法,为其配置ArrayAdapter即可



ListView+SimpleAdapter 开发流程
1) 在activity_main.xml中添加ListView控件,至少配置id、layout_width、layout_height属性,除此以外,ListView没有必要属性
2) 在MainActivity.java中,创建数据源List<Map<?,?>>,并在其中添加各项数据(Ps:在使用SimpleAdapter时,数据的集合都应该是List<Map<k,y>>类型的)
3) 在res\layout下,创建新的XML文件,根节点直接选择TextView
4) 在MainActivity.java中,声明并创建SimpleAdapter<T>,构造方法中应用R.layout.xxxx(第3步骤的文件)和数据源、from(根据Map的哪个key把数据取出来)、to(把取出来的数据显示到哪个空间上);
5) 初始化ListView控件的对象,调用ListView的setAdapter()方法,为其配置SimpleAdapter即可


ListView+BaseAdapter
1) 创建ContactAdapter继承自BaseAdapter,并添加抽象方法
2) 把getItem()和getItemId()方法置于最后,这2个方法暂时不用具体实现(不写代码)
3) 声明List<Contact>属性,并添加同类型参数的构造方法,通过构造方法设置该属性的值
4) 声明Context属性,并添加同类型参数的构造方法,通过构造方法设置该属性的值
5) 声明LayoutInflater属性,在构造方法中,通过LayoutInflater.from(Context context)方法设置该属性的值
6) 重写getCount()方法,返回值是List<Contact>的长度
7) 重写getView()方法,先使用LayoutInflater将模板加载为程序中的对象(View view),然后通过该对象获取模板中的控件(TextView tvName = (TextView)view.findViewById(R.id.xxxx);),再根据getView()方法的第1个参数int position从List<Contact>中获取需要显示的数据,设置到控件中,最后,返回View对象

关于BaseAdapter的优化
------------------------------------------
在使用BaseAdapter时,通过模板加载布局对象之前,应该对getView()方法的第2个参数View convertView进行判断,如果为null,则加载布局,否则,不加载。
因为ListView会自动重复使用convertView,当最顶部的Item滑出屏幕时,会将用于显示它的View对象作为底部新出现的Item的View对象,用于调用BaseAdapter的getView()方法。
以上优化原则是基于Android自动重复使用View对象实现的。


关于BaseAdapter的优化--使用ViewHolder
------------------------------------------
推荐在ContactAdapter中定义内部类ViewHolder,用于封装模板中的各个控件,在getView()中,如果convertView为null,则创建新的ViewHolder,为ViewHolder中的各个控件赋值,并调用convertView的setTag()方法将ViewHolder对象封装起来,如果convertView()不为null,则直接调用convertView的getTag()方法获取ViewHolder对象。
通过以上代码,可以减少findViewById()的次数,以提升应用程序的性能。









發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章