listview的工作机制
listView在开始绘制的时候,系统首先调用getCount()函数,根据他的返回值得到listView的长度,然后根据这个长度,调用getView()逐一绘制每一行。
系统显示列表时,首先实例化一个适配器(这里将实例化自定义的适配器)。当手动完成适配时,必须手动映射数据,这需要重写getView()方法。系统在绘制列表的每一行的时候将调用此方法。getView()有三个参数,position表示将显示的是第几行,covertView是从布局文件中inflate来的布局。我们用LayoutInflater的方法将定义好的item.xml文件提取成View实例用来显示。然后将xml文件中的各个组件实例化(简单的view.findViewById()方法)。这样便可以将数据对应到各个组件上了。但是为了响应点击事件,需要为它添加点击监听器,这样就能捕获点击事件。系统要绘制ListView了,他首先获得要绘制的这个列表的长度,然后开始绘制第一行,怎么绘制呢?调用getView()函数。在这个函数里面首先获得一个View(实际上是一个ViewGroup),然后再实例并设置各个组件,显示之。好了,绘制完这一行了。那再绘制下一行,直到绘完为止。
Adapter是连接后端数据和前端显示的适配器接口,是数据和UI(View)之间一个重要的纽带。在常见的View(ListView,GridView)等地方都需要用到Adapter。
例子:
//上下文,自定义的listview元素项布局,listview对应的list
MineTravelAdapter mineTravelAdapter = new MineTravelAdapter(MineActivity.this, R.layout.mine_travel_item, mineTravel);
listView.setAdapter(mineTravelAdapter);
private class MineMoodAdapter extends ArrayAdapter<MineMoodItem> {
private int resourceId;
public MineMoodAdapter(Context context, int resource,List<MineMoodItem> objects) {
super(context, resource, objects);
resourceId = resource;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
MineMoodItem mineMood = getItem(position);// 获取当前项的MineMood实例
View view = LayoutInflater.from(getContext()).inflate(resourceId,null); //获得listview的子项布局
// 获取子项布局里面的文本控件
TextView mineMoodTime = (TextView) view.findViewById(R.id.time); //注意是view.findViewById();
TextView mineMoodSpotname = (TextView) view.findViewById(R.id.spotname);
// 填充数据
mineMoodTime.setText(mineMood.getTime());
mineMoodSpotname.setText(mineMood.getSpotName());
return view;
}
}
posted on 2016-04-21 14:50 Day_to_Day 阅读(202) 评论(0) 编辑 收藏 举报