ListView
ListView顾名思义就是列表视图,用于显示多行数据的视图,
ListView本身属于容器视图,它需要借助适配器(adapter)来显示内容
listView选项添加监听事件: setonItemClickListener()
其中的方法 onItemClick<parent,View view, int position, long id>();
parent 是被点击数据项所属listView的对象
view是接受被选中的是被选中数据项的TextView对象
position接收的是在适配器/list集合/spinner中的位置
适配器 :是连接适配器控件(AdapterView)和数据源的桥梁,通过它能有效地实现数据与AdapterView的分离设置,使AdapterView与数据的绑定更加简便,修改更加方便。
1.适配器控件:包含多项相同格式资源的列表,每项只显示一次。常用的适配器控件有:GridIView,ListView,Spinner,Gallery;
2.适配器对象:给适配器控件提供数据。常用的适配器有:ArrayAdapter,SimpleAdapter,SimpleCursorAdapter和自定义Adapter;
系统提供adapter的适配器:
首先: 声明: ArrayAdapter<String> adapter=new ArrayAdapter<String>(context, resource, textViewResourceId);
第一个参数 context :表示上下文,即调用此适配器的类的对象,XXX.this
第二个参数 resource :即用于显示每个ListView资源的布局xml文件,系统默认的即就是:android.R.layout.simple_list_item_1
第三个参数 textViewResourceId:需要传入集合对象,即适配器中存放的资源
然后: listview.setAdapter(adapter); 将适配器添加到listView中(在spinner,autocompleteTextView中也是这样)
最后:假如适配器里存放的内容需要更新
则利用第三个参数的对象, 首先 list.clear() 清空, 其次list.add()向里面加值,最后调用adapter.notifyDataSetChanged();将更新内容存到容器中去
自定义适配器
(1)新建一个类 ,让它继承BaseAdapter接口
(2) 声明构造函数及需要传入的三个参数:1,。上下文 2,。此适配器的布局xml文件id 3,适配器中需要传入的值
下面就用代码简单解释三种适配器(三种是越来越优化的 ,所以一般只用第三种)
public class Myadapter extends BaseAdapter {
private Context context;
private List<String> list;
private int ResourceId;
public Myadapter(Context context,int ResourceId,List<String> list)//三个需要传入的参数
{
this.context=context;
this.ResourceId=ResourceId;
this.list=list;
}
@Override //返回list集合中值的个数
public int getCount() {
int count=0;
if(list!=null)
{
count=list.size();
}
return count;
}
@Override//返回集合中对应position的值
public Object getItem(int position) {
// TODO Auto-generated method stub
return list.get(position);
}
@Override//返回list中元素的位置position
public long getItemId(int position) {
// TODO Auto-generated method stub
return 0;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
此方法对自定义适配器来说是最重要的,其中三个参数为:
//参数接收的position是显示数据项在集合中的位置,根据位置获得item值
//convertView来记录消失的布局对象,直接使用在新出现的布局中
三种写法的步骤--》获取布局文件对象--》获取视图组件对象--》对视图组件进行赋值--》返回布局文件对象
/*//适配器的第一种写法
//<1>根据布局文件的xml生成布局对象 ,其中getLayoutInflater()方法在MainActivity
// 中没有,所以需要向上转型成activity然后再调用
LayoutInflater inflater=((Activity)context).getLayoutInflater();
//获得xml布局对象,第一个参数为xml布局的id,第二个为parent,但必须置空
View view=inflater.inflate(ResourceId, null);
//获取适配器对应位置的list值
String item=(String)list.get(position);
//根据布局对象获取适配器对象
TextView textView=(TextView) view.findViewById(R.id.textView);
//将每个对应的值写到textView中去
textView.setText(item);
//返回xml布局对象,
return view;
*/
//适配器的第二种写法(优化了第一种写法):实现布局对象的复用
//因为每在屏幕上显示一个listView就会,创建一个新的布局对象,为了节省内存空间
//利用convertView来记录消失的布局对象,直接使用在新出现的布局中
/*if(convertView==null)
{
//获得xml布局对象
convertView=LayoutInflater.from(context).inflate(ResourceId, null);
//第二种写法
//convertView=LayoutInflater.from(context).inflate(ResourceId, parent,false);
}
//根据xml布局对象获得视图对象
TextView textView=(TextView) convertView.findViewById(R.id.textView);
//向视图中添加信息
textView.setText(list.get(position).toString());
return convertView;*/
//适配器的第三种写法,(优化了第二种),实现了不用多次findViewByid这个操作,只是将它绑定
//在covertView中一起同步使用,
//<1>首先创建一个内部类 用于存放视图对象;
//<2>其次获得xml布局对象
ViewHolder holder;
if(convertView==null)
{ //与第二种一样
convertView=LayoutInflater.from(context).inflate(ResourceId, null);
holder=new ViewHolder();
//将获得的视图对象保存成内部类的成员变量
holder.textView=(TextView) convertView.findViewById(R.id.textView);
//将此内部类作为converView的tag标签
convertView.setTag(holder);
}
//去除convertView中的标签
holder=(ViewHolder) convertView.getTag();
//设置textView的内容
holder.textView.setText(list.get(position).toString());
return convertView;
}
class ViewHolder //此内部类是专门为第三种方法减少获取组件findViewByid(R.id.textView)而建立的
{
TextView textView;
}
}