ListView
* 就是用来显示一行一行的条目的
* 每一个条目都是一个View对象
BaseAdapter 最常用的
ListView lv = (ListView) findViewById(R.id.
lv
);
lv.setAdapter(
new
BaseAdapter() {
@Override
public
View getView(
int
position, View convertView, ViewGroup parent) {
View v =
null;
//
ListView代码的优化(非常重要) 因为上面的代码会重复的创建textView对象,很有可能会照成内存溢出
if(convertView!=null){
v =View.inflate(MainActivity.this, R.layout.list_items, null);v =View.inflate(MainActivity.this, R.layout.list_items, null);
}else{
v= convertView;
}
Person p =
list
.get(position);
TextView tv_name = (TextView) v.findViewById(R.id.
name
);
tv_name.setText(p.getName());
return
v;
}
@Override
public
int
getCount() {
//
TODO
Auto-generated method stub
return list.size();
}
//下面的这两个方法暂时不要管
@Override
public
long
getItemId(
int
position) {
//
TODO
Auto-generated method stub
return
0;
}
@Override
public
Object getItem(
int
position) {
//
TODO
Auto-generated method stub
return
null
;
}
});
}
进一步优化
1.创建一个ViewHolder内部类
2.把list_items中的所有控件都保存在
ViewHolder中
3.给view设置Tag
4.取出view中的Tag
public
View getView(
int
position, View convertView, ViewGroup parent) {
News news =
newsList
.get(position);
View v =
null
;
ViewHolder mHolder;
if
(convertView ==
null
){
v = View.inflate(MainActivity.
this
, R.layout.
item_listview
,
null
);
mHolder =
new
ViewHolder();
//把布局文件中所有组件的对象封装至ViewHolder对象中
mHolder.
tv_title = (TextView) v.findViewById(R.id.tv_title);
mHolder.tv_detail = (TextView) v.findViewById(R.id.tv_detail);
mHolder.tv_comment = (TextView) v.findViewById(R.id.tv_comment);
mHolder.siv = (SmartImageView) v.findViewById(R.id.iv);
//把ViewHolder对象封装至View对象中
v.setTag(mHolder);
}
else
{
v = convertView;
mHolder = (ViewHolder) v.getTag();
}
//给三个文本框设置内容
mHolder.tv_title.setText(news.getTitle());
mHolder.tv_detail.setText(news.getDetail());
mHolder.tv_comment.setText(news.getComment() + "条评论");
//给新闻图片imageview设置内容
mHolder.
siv
.setImageUrl(news.getImageUrl());
return
v;
}
class ViewHolder{
//条目的布局文件中有什么组件,这里就定义什么属性
TextView tv_title;
TextView tv_detail;
TextView tv_comment;
SmartImageView siv;
}
当我们需要写一些复杂条目的listView时,上面的就不够用了。我们需要
1.先在布局文件中写一个list_item布局,作为listview的子布局
2.利用下面三种方式都可以获得一个布局填充器对象,然后填充我们写的子布局文件
ArrayAdapter 只能对一种数据进行操作,比如只是对“名字”进行操作
String[] objects = { "aa", "bb", "cc" };
ListView lv = (ListView) findViewById(R.id.lv);
lv.setAdapter(new ArrayAdapter<String>(this,
android.R.layout.simple_list_item_1, objects));
SimpleAdapter 可以对两种数据进行操作
ListView lv = (ListView) findViewById(R.id.lv);
List<Map<String, Object>> data = new ArrayList<Map<String, Object>>();
Map<String, Object> map1 = new HashMap<String, Object>();
map1.put("photo", R.drawable.ic_launcher);
map1.put("name", "老王1");
data.add(map1);
Map<String, Object> map2 = new HashMap<String, Object>();
map2.put("photo", R.drawable.ic_launcher);
map2.put("name", "老王2");
data.add(map2);
Map<String, Object> map3 = new HashMap<String, Object>();
map3.put("photo", R.drawable.ic_launcher);
map3.put("name", "老王3");
data.add(map3);
/**
* 参数1:context没什么好说的 参数2:数据(这里我们就是自定义的一个map数组)
* 参数3:自定义的一个listview的子条目布局文件 参数4:数据中KEY的值的集合 参数5:子条目布局文件中的id
*/
lv.setAdapter(new SimpleAdapter(this, data, R.layout.simple_items,
new String[] { "photo", "name" }, new int[] { R.id.iv_photo,
R.id.tv_name }));
---进一步的优化用一个MyHolder内部类保存控件的信息,具体参见第一行代码部分。