自定义Adapter 类步骤:
1、继承BaseAdapter类
2、添加抽象方法:(4个)
3、MyAdapter 需要的参数有两个:
(1)、List<PhoneInfo> lists ; 存放内容
(2)、Context 承接上下文
4、创建构造方法: 在构造方法中进行传递参数
MyAdapter(List<PhoneInfo> lists,Context context){
this.context = context;
this.lists = lists;
}
5、重写四个抽象方法
(1)、int getCount() 返回的是集合的数量 一般: return lists.size();
(2)、Object getItem(int position) 返回当前的数据 一般return lists.get(position);
(3)、long getItemId(int position) 返回当前数据的ID 一般 return position;
(4)、重点 View getView(int position,View converView,ViewGroup parent)
返回的是一个view 同时把内容加载到视图当中
(1)、首先创建自定义的子View;即ListView 中每一条View中显示的内容
(2)、在最外层创建布局文件 例如LinearLayout layout;
(3)、获取加载View的权限
LayoutInflater inflater = LayoutInflater.from(context);
(4)、通过layout对象进行加载
Layout =(LinearLayout) inflater.inflate(R.layout.call,null);
第一个参数是自定义的子View所在的XML文件
(5)、声明里面的组件 例如:
TextView name = (TextView) layout.findViewById(R.id.name);
TextView number= (TextView) layout.findViewById(R.id.number);
(6)、把内容添加进去 内容通过集合lists 来进行获取 例如:
name.setText(lists.get(position).getName());
number.setText(lists.get(position).getNumber());
(7)、最后返回一个View return layout;
(5)、对View getView进行优化 利用 class ViewHolder类
1、在ViewHolder类中创建需要用到的组件
2、在getView 方法中创建ViewHolder 对象
Private static class ViewHolder{
TextView name,number;
}
3、对converView 进行判断
(1)、如果convertView 为空代表没有加载View 所以要加载view
通过convertView = LayoutInflater.from(context).inflate(R.layout.call,null);
对holder进行实例化通过holder 加载组件和内容
holder.name = (TextView)converView.findViewById(R.id.name);
holder.number = (TextView)converView.findViewById(R.id.number);
holder.name.setText(lists.get(position).getName());
holder.name.setText(lists.get(position).getName());
第一次加载完毕需要通过convertView.setTag(holder); 来把标签进行存储
(2)、如果convertView不为空 代表它已经加载过 我们在向上滑的时候加载新的
数据,我们不能再重新加载View 而是引用我们所存储的View通过
Holder = (VIewHolder)convertView.getTag();
(3)、返回当前的View return convertView;
public class MyAdapter extends BaseAdapter { //需要两个参数 private List<PhoneInfo> lists; //存放内容 private Context context; //承接上下文 private LinearLayout layout; MyAdapter(List<PhoneInfo> lists, Context context) { //创建构造方法 在构造方法中进行传递参数 this.context = context; this.lists = lists; } @Override public int getCount() { //返回集合的数量 return lists.size(); } @Override public Object getItem(int position) { //返回当前的数据 return lists.get(position); } @Override public long getItemId(int position) { //返回当前数据所在的ID return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { //重点:返回一个View 同时把内容加载到视图当中 // LayoutInflater inflater = LayoutInflater.from(context); 获取View的权限 // layout=(LinearLayout)inflater.inflate(R.layout.call,null); // TextView nametv =(TextView) layout.findViewById(R.id.name); // TextView numbertv = (TextView) layout.findViewById(R.id.number); // nametv.setText(lists.get(position).getName()); // numbertv.setText(lists.get(position).getNumber()); //对View getView进行优化 利用class ViewHolder类 ViewHolder holder; if (convertView == null) { //对convertView进行判断 若为空代表没有加载View convertView = LayoutInflater.from(context).inflate(R.layout.call, null); //获取View的权限并加载XML布局文件 holder = new ViewHolder(); //实例化ViewHolder 并加载组件和内容 holder.nametv = (TextView) convertView.findViewById(R.id.name); holder.numbertv = (TextView) convertView.findViewById(R.id.number); holder.nametv.setText(lists.get(position).getName()); holder.numbertv.setText(lists.get(position).getNumber()); convertView.setTag(holder); //第一次加载完毕 把标签进行存储 } else { //convertView 不为空 代表已经加载过 当我们向上滑时加载新的数据 我们不能重新加载View 而是要引用所存储的View holder = (ViewHolder) convertView.getTag(); //引用存储的View holder.nametv.setText(lists.get(position).getName()); holder.numbertv.setText(lists.get(position).getNumber()); } return convertView; } private static class ViewHolder { //在ViewHolder类中创建需要用到的组件 TextView nametv; TextView numbertv; } }