Android高级UI-listView的原理及优化
2016-05-11 22:44
411 查看
listView的原理及优化 ★
原理:
1、先去执行 getcount 获取总条目个数
2、计算一屏显示的条目个数,执行 对应 次数的 getView
3、每次手指滑动listview,根据计算,执行对应次数的getView
结论:getCount =100,将会执行100次getView
优化:
1、创建ViewHolder 类
class ViewHolder{
控件类 控件名;
}
2、getView中写代码
View view=null;
ViewHolder holder=null;
if(convertView==null){
创建布局
view=View.inflate();
创建holder对象
holder=new ViewHolder();
找控件
holder.控件名=view.findViewById();
将holder保存到view对象
view.setTag(holder);
}else{
view=convertView;
holder = view.getTag();
}
holder.控件名.setText();
.xml就是一个ListView控件
<ListView
android:id="@+id/lv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
.java
public class MainActivity extends ActionBarActivity {
private List<String> list;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ListView lv = (ListView) findViewById(R.id.lv);
initData();
lv.setAdapter(new BaseAdapter() {
@Override
public View getView(int position, View convertView, ViewGroup parent) {
//优化1:先去判断有没有可以再利用的view对象,如果有,直接拿来用;如果没有,则重新创建
Viewholder holder=null;
View view=null;
if(convertView==null){
//没有可用的对象
//核心语句1: 创建布局对象—— 每个条目都是一样
view=View.inflate(MainActivity.this, android.R.layout.simple_expandable_list_item_1, null);
System.out.println("getView....新用"+position);
//核心语句2:找 布局对象中各个控件——每个条目都是一样
holder=new Viewholder();
holder.text1 = (TextView) view.findViewById(android.R.id.text1);
//将holder存到view上
view.setTag(holder);
}else{
view=convertView;
System.out.println("convertView....复用"+convertView);
holder=(Viewholder) view.getTag();
}
//核心语句3:为每个控件设置数据——每个条目不一样的!!!
holder.text1.setText(list.get(position));
return view;
}
@Override
public long getItemId(int arg0) {
// TODO Auto-generated method stub
return arg0;
}
@Override
public Object getItem(int arg0) {
// TODO Auto-generated method stub
return list.get(arg0);
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return list.size();
}
});
}
class Viewholder{
TextView text1;
}
private void initData() {
list = new ArrayList<String>();
// TODO Auto-generated method stub
for (int i = 0; i < 100; i++) {
list.add("哈哈,是我"+i);
}
}
}
然后在当滑动手机中的list集合时候,在log Cat中会有相应的输出,就是手机刚开始打印的都是新用,你在下拉的时候都是复用
原理:
1、先去执行 getcount 获取总条目个数
2、计算一屏显示的条目个数,执行 对应 次数的 getView
3、每次手指滑动listview,根据计算,执行对应次数的getView
结论:getCount =100,将会执行100次getView
优化:
1、创建ViewHolder 类
class ViewHolder{
控件类 控件名;
}
2、getView中写代码
View view=null;
ViewHolder holder=null;
if(convertView==null){
创建布局
view=View.inflate();
创建holder对象
holder=new ViewHolder();
找控件
holder.控件名=view.findViewById();
将holder保存到view对象
view.setTag(holder);
}else{
view=convertView;
holder = view.getTag();
}
holder.控件名.setText();
.xml就是一个ListView控件
<ListView
android:id="@+id/lv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
.java
public class MainActivity extends ActionBarActivity {
private List<String> list;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ListView lv = (ListView) findViewById(R.id.lv);
initData();
lv.setAdapter(new BaseAdapter() {
@Override
public View getView(int position, View convertView, ViewGroup parent) {
//优化1:先去判断有没有可以再利用的view对象,如果有,直接拿来用;如果没有,则重新创建
Viewholder holder=null;
View view=null;
if(convertView==null){
//没有可用的对象
//核心语句1: 创建布局对象—— 每个条目都是一样
view=View.inflate(MainActivity.this, android.R.layout.simple_expandable_list_item_1, null);
System.out.println("getView....新用"+position);
//核心语句2:找 布局对象中各个控件——每个条目都是一样
holder=new Viewholder();
holder.text1 = (TextView) view.findViewById(android.R.id.text1);
//将holder存到view上
view.setTag(holder);
}else{
view=convertView;
System.out.println("convertView....复用"+convertView);
holder=(Viewholder) view.getTag();
}
//核心语句3:为每个控件设置数据——每个条目不一样的!!!
holder.text1.setText(list.get(position));
return view;
}
@Override
public long getItemId(int arg0) {
// TODO Auto-generated method stub
return arg0;
}
@Override
public Object getItem(int arg0) {
// TODO Auto-generated method stub
return list.get(arg0);
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return list.size();
}
});
}
class Viewholder{
TextView text1;
}
private void initData() {
list = new ArrayList<String>();
// TODO Auto-generated method stub
for (int i = 0; i < 100; i++) {
list.add("哈哈,是我"+i);
}
}
}
然后在当滑动手机中的list集合时候,在log Cat中会有相应的输出,就是手机刚开始打印的都是新用,你在下拉的时候都是复用
相关文章推荐
- 完美实现Android ListView中的TextView的跑马灯效果
- android上改变listView的选中颜色
- MySQL 优化
- Google排名优化的几个影响因素
- DB2优化(简易版)
- Mysql limit 优化,百万至千万级快速分页 复合索引的引用并应用于轻量级框架
- C#中尾递归的使用、优化及编译器优化
- 对优化Ruby on Rails性能的一些办法的探究
- 优化Ruby脚本效率实例分享
- Delphi7中Listview的常用功能汇总
- Delphi控件ListView的属性及使用方法详解
- Asp编码优化技巧
- 如何监测和优化OLAP数据库
- mysql -参数thread_cache_size优化方法 小结
- 深入学习SQL Server聚合函数算法优化技巧
- MySQL常见的底层优化操作教程及相关建议
- 详解mysql的limit经典用法及优化实例
- android中ListView数据刷新时的同步方法
- Android提高之ListView实现自适应表格的方法
- Android中实现水平滑动(横向滑动)ListView示例