1、首先listView需要一个适配器
FruitAdapter fruitAdapter = new FruitAdapter(MainActivity.this, R.layout.fruit_item, fruitList);
listView.setAdapter(fruitAdapter);
FruitAdapter参数:①当前上下文,②ListView子项布局ID,③要适配的数据(List)
2、适配器fruitAdapter extends ArrayAdapter(泛型指定为Fruit类),通过getView()方法生成每一子项的view;
view = LayoutInflater.from(context).inflate(resourceID, null);
→用LayoutInflater来为子项加载我们要传入的布局
.inflate参数:①动态加载布局的ID,②给加载好的布局再添加一个父布局
❉ getView方法在每个子项被滚动到屏幕内的时候都会被调用
❉ getView参数中convertView用于将之前加载好的布局进行缓存
@Override
// 在每个子项被滚动到屏幕内的时候都会被调用
public View getView(int position, View convertView, ViewGroup parent) {
// 获取当前Fruit实例
Fruit fruit = getItem(position);
View view = null;
ViewHolder viewHolder;
// 第一步优化,使用convertView
if (convertView == null) {
view = LayoutInflater.from(context).inflate(resourceID, null);
// 第二步优化,将所有控件的实例都缓存在ViewHolder里,
// 这样就不会每次都通过findViewByID()方法来获取控件实例了
viewHolder = new ViewHolder();
viewHolder.fruitImage = (ImageView) view.findViewById(R.id.fruit_image);
viewHolder.fruitName = (TextView) view.findViewById(R.id.fruit_name);
view.setTag(viewHolder);
// 将viewHolder通过setTag()方法储存在view中
} else {
// 对convertView进行重用,提高运行效率
viewHolder = (ViewHolder) view.getTag();
}
viewHolder.fruitImage.setImageResource(fruit.getImageID());
viewHolder.fruitName.setText(fruit.getName());
return view;
}
class ViewHolder {
ImageView fruitImage;
TextView fruitName;
}
view.setTag(viewHolder);表示给view中添加一个额外的数据,以后可以用getTag将这个数据取出。
3、ListView的点击事件
listView.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Fruit fruit=fruitList.get(position);
Toast.makeText(MainActivity.this,fruit.getName(), Toast.LENGTH_SHORT).show();
}
});
Toast.makeText(MainActivity.this,"setOnItemClickListener后面的方法不会因为点击事件再执行吧!", Toast.LENGTH_SHORT).show();
❉ position参数判断出用户点击的是哪一个子项