Android提供了 ArrayAdapter和 SimpleAdapter,但都有一定局限性。当某些列表项需要一些特性,或者对列表项中的某些控件需要设置监听器时,就不够用了。这时需要用到自定义Adapter
直接上代码
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;
import android.content.Context;
import java.util.List;
/**
* Created by deng on 2016/10/13.
*/
public class MyAdapter extends BaseAdapter {
private Context context;
private List<Contact> list;
public MyAdapter(Context context, List<Contact> l) {
list = l;
this.context = context;
}
@Override
public int getCount() {
if (list == null) return 0;
return list.size();
}
@Override
public Object getItem(int position) {
if (list == null) return null;
return list.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View view, ViewGroup parent) {
// 新声明一个View变量和ViewHolder变量
View convertView;
ViewHolder viewHolder;
if (view == null) {
convertView = LayoutInflater.from(context).inflate(R.layout.mainlistitem, null);
viewHolder = new ViewHolder();
viewHolder.name = (TextView)convertView.findViewById(R.id.mainListName);
viewHolder.firstName = (TextView)convertView.findViewById(R.id.mainListFirstName);
convertView.setTag(viewHolder);
} else {
convertView = view;
viewHolder = (ViewHolder)convertView.getTag();
}
viewHolder.name.setText(list.get(position).getName());
viewHolder.firstName.setText(list.get(position).getFirstName());
return convertView;
}
private class ViewHolder {
public TextView name;
public TextView firstName;
}
}
注意:
1.自定义Adapter需要继承BaseAdapter
2.需要重写4个方法
int getCount();获得数据项列表的长度,也就是一共有多少个数据项。
Object getItem(int i);获得某一个数据项。
long getItemId(int i);获得数据项的位置。
View getView(int i, View view, ViewGroup viewGroup);获得数据项的布局样式,最重 要的一个方法。
3.自定义 Adapter 需要提供给一个数据列表才能填充数据,一般是一个 List 类型
4.最重要的方法 getView
参数含义:
i:当前是在加载第几项的列表项
viewGroup:是列表项View的父视图,调整了列表项的高宽用
view:指一个列表项的视图,需要给view一个布局,然后在布局中放置我们需要的内容
最基本写法
缺点:
1.这种方法没有充分利用 view 的特点,只是每次从屏幕外滚进来一个新的项就再加载一次布 局。其实 ListView 每次从屏幕外滚进来一项就会有一项滚出屏幕外,这个时候 view 是有 内容的,不过是旧的内容,因此我们只需要改变一下 view 的内容然后返回它就可以了,不 需要再去加载一次布局。
2.每次findViewById(),降低了ListView的效率。因此,使用setTag的方法和新建一个ViewHolder类来提高这部分效率。
最终版在开头贴出代码