ListView

ListView : 用于在应用程序中使用列表的形式来展现一些内容。
1)将数据填充到布局 2)处理用户的选择点击等操作
ListView的创建需要3个元素。
(1)ListView中的每一列的View。
(2)填入View的数据或者图片等。
(3)连接数据与ListView的适配器。
常用适配器:
ArrayAdapter :用来绑定一个数组,支持泛型操作
SimpleAdapter : 用来绑定在xml中定义的控件对应的数据
SimpleCursorAdapter:用来绑定游标得到的数据
BaseAdapter:通用的基础适配器
很多时候需要在列表中展示一些除了文字以外的东西,比如图片等。这时候可以使用SimpleAdapter。
优化:
ListView不只是展示数据,也不仅仅是这一行要来处理用户的操作,而是里面的控件要获得用户的焦点。这时候最方便的方法就是使用灵活的适配器BaseAdapter了。
使用BaseAdapter必须写一个类继承它,同时BaseAdapter是一个抽象类,继承它必须实现它的方法。getCount()、getItem()、getItemId()、getView()方法
@Override
public View getView(finalint position, View convertView, ViewGroup parent) {
ViewHolder holder;
//观察convertView随ListView滚动情况
Log.v(“MyListViewBase”, “getView ” + position + ” ” + convertView);
if (convertView == null) {
convertView = mInflater.inflate(R.layout.item, null);
holder = new ViewHolder();
/得到各个控件的对象/
holder.title = (TextView) convertView.findViewById(R.id.ItemTitle);
holder.text = (TextView) convertView.findViewById(R.id.ItemText);
holder.bt = (Button) convertView.findViewById(R.id.ItemButton);
convertView.setTag(holder);//绑定ViewHolder对象
}
else{
holder = (ViewHolder)convertView.getTag();//取出ViewHolder对象
}
/设置TextView显示的内容,即我们存放在动态数组中的数据/
holder.title.setText(getDate().get(position).get(“ItemTitle”).toString());
holder.text.setText(getDate().get(position).get(“ItemText”).toString());
/为Button添加点击事件/
holder.bt.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Log.v(“MyListViewBase”, “你点击了按钮” + position); //打印Button的点击信息
}
});
return convertView;
}
}
/存放控件/
publicfinalclass ViewHolder{
public TextView title;
public TextView text;
public Button bt;
}
}
convertView相当于一个缓存,开始为0,当有条目变为不可见,它缓存了它的数据,后面再出来的条目只需要更新数据就可以了,这样大大节省了系统资料的开销。
当convertView为空时,用setTag()方法为每个View绑定一个存放控件的ViewHolder对象,用于缓存要显示的数据,可以达到图像数据异步加载的效果。当convertView不为空,重复利用已经创建的view的时候,使用getTag()方法获取绑定的ViewHolder对象,这样就避免了findViewById对控件的层层查询,而是快速定位到控件。
如果listview需要显示的item很多,就要考虑分页加载。比如一共要显示100条或者更多的时候,我们可以考虑先加载20条,等用户拉到列表底部的时候再去加载接下来的20条。

RecycleBin机制是ListView能够实现成百上千条数据都不会OOM最重要的一个原因。RecycleBin是AbsListView的一个内部类。
*RecycleBin当中使用mActiveViews这个数组来存储View,调用这个方法后就会根据传入的参数来将ListView中的指定元素存储到mActiveViews中。
*mActiveViews当中所存储的View,一旦被获取了之后就会从mActiveViews当中移除,下次获取同样位置的时候将会返回null,所以mActiveViews不能被重复利用。
*addScrapView()用于将一个废弃的View进行缓存,该方法接收一个View参数,当有某个View确定要废弃掉的时候(比如滚动出了屏幕)就应该调用这个方法来对View进行缓存,RecycleBin当中使用mScrapViews和mCurrentScrap这两个List来存储废弃View。
*getScrapView 用于从废弃缓存中取出一个View,这些废弃缓存中的View是没有顺序可言的,因此getScrapView()方法中的算法也非常简单,就是直接从mCurrentScrap当中获取尾部的一个scrap view进行返回。
我们都知道Adapter当中可以重写一个getViewTypeCount()来表示ListView中有几种类型的数据项,而setViewTypeCount()方法的作用就是为每种类型的数据项都单独启用一个RecycleBin缓存机制。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值