Android自定义Adapter

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类来提高这部分效率。
最终版在开头贴出代码




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值