ArrayAdapter的使用方法
- ArrayAdapter的简单使用
- 继承ArrayAdapter
ArrayAdapter的简单使用
首先看一下ArrayAdapter的六个构造函数:
- ArrayAdapter(Context context, int resource);
- ArrayAdapter(Context context, int resource, int textViewResourceId);
- ArrayAdapter(Context context, int resource, T[] objects);
- ArrayAdapter(Context context, int resource, List objects);
- ArrayAdapter(Context context, int resource, int textViewResourceId, T[] objects);
- ArrayAdapter(Context context, int resource, int textViewResourceId, List objects);
对于 1. 的构造方法的使用是:
ArrayAdapter<Student> adapter = new ArrayAdapter<Student>(this,R.layout.list_only_item);
adapter.add(new Student("tiantian", 28));
adapter.add(new Student("xiangshang", 43));
adapter.add(new Student("chongji", 30));
list.setAdapter(adapter);
这里的list_item布局里面只能有一个TextView; 如果你还有其他东西,那么就得使用构造器2了
ArrayAdapter<Student> adapter = new ArrayAdapter<Student>(this,R.layout.list_item, R.id.name);
adatper.addAll(studentArray);
list.setAdapter(adapter);
R.id.name,是list_item中的一个控件且必须是TextView, 如果你觉得添加数据比较麻烦也可以使用下面的3, 4, 5, 6 构造函数,直接将一个容器传入进去 ArrayAdapter有一套这样的操作:
adatper.add(student), adatper.addAll(studentArray), adatper.addAll(studentList) adatper.remove(student), adatper.insert(student index), adatper.clear()
直接使用原来的构造器这种写法比较简单,但是缺点是,布局中至少包含一个TextView,而且你传入进去的类要实现toString()方法(它将toString的返回值设置给TextView) 如果你使用的是构造器2那么你在R.layout.list_item 上写的其他控件没办法为它们设值,只能显示固定数据,比如ImageView只能显示一张固定的照片,没办法像继承BaseAdapter一样在getView中进行设置那我们就继承
继承ArrayAdapter
为了使得ArrayAdapter使用更加灵活,我们可以继承ArrayAdapter实现自己的Adapter
首先我们定义了一个Student类:
class Student{
private int avatar;
private String name;
private boolean attend;
public Student(int avatar, String name, boolean attend) {
this.avatar = avatar;
this.name = name;
this.attend = attend;
}
public int getAvatar() {
return avatar;
}
public void setAvatar(int avatar) {
this.avatar = avatar;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public boolean isAttend() {
return attend;
}
public void setAttend(boolean attend) {
this.attend = attend;
}
}
接下来是我们的继承实现自己的MyAdapter
class MyAdapater extends ArrayAdapter<Student>{
private LayoutInflater inflater;
private void initeLayoutInflater(Context context){
inflater = LayoutInflater.from(context);
}
public MyAdapater(Context context) {
super(context, 0);
initeLayoutInflater(context);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder = null;
if(convertView == null){
convertView = inflater.inflate(R.layout.listview_item, null);
holder = new ViewHolder();
holder.imageView = (ImageView)convertView.findViewById(R.id.avatar);
holder.name = (TextView)convertView.findViewById(R.id.name);
holder.attend = (CheckBox)convertView.findViewById(R.id.attend);
convertView.setTag(holder);
}
holder = (ViewHolder)convertView.getTag();
holder.imageView.setImageResource(getItem(position).getAvatar());
holder.name.setText(getItem(position).getName());
holder.attend.setChecked(getItem(position).isAttend());
return convertView;
}
class ViewHolder{
ImageView imageView;
TextView name;
CheckBox attend;
}
}
好了核心代码: adapter.addAll(getListData()); listView.setAdapter(adapter);
getListData() 返回一个装着Student实例的List 自己实现吧! 而且这里Student不需要实现toString方法, ArrayAdapter默认背后有一个ArrayList存储数据