自定义简单的万能适配器

适配器在android中非常的常用,像ListView,GridView,下拉框。。。中都比较常用,

这篇博客介绍一个万能的适配器,虽然比较简单,但是用处比较大。(不用一个个再去创建适配器了)

此列子创建的是一个虚类,使用的时候需要继承此类,并实现相应的方法。

public abstract class SimpleBaseAdapter<T> extends BaseAdapter{
    //调用类传入的Context
    Context context
    //需要的数据,使用泛型;
    List<T> data;

    //构造方法,传入context和数据
    public SimpleBaseAdapter(Context context, List<T>data){
        this.context = context;
        this.data = data == null ? new ArrayList<T>() : data;
    }

    @Override
    public int getCount() {
        return data.size();
    }

    @Override
    public Object getItem(int position) {
        if(position >= data.size())
        {
            return null;
        }
        return data.get(position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    //继承类所需要实现的方法,获取列表项的布局id
    public abstract int getItemRsouce();
    //继承类所需要实现的方法,获取列表项的view
    public abstract View getItemView(int position,View convertView,ViewHolder holder);

    //适配器中最重要的方法,之所以返回view调用getItemView()这个方法
    //是因为返回的view中的子view需要根据实现类中view的id确认
    @SuppressWarnings("unchecked")
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder holder;
        if(convertView == null) {
            convertView = View.inflate(context, getItemRsouce(), null);
            holder = new ViewHolder(convertView);
            convertView.setTag(holder);
        }
        else{
            holder = (ViewHolder) convertView.getTag();
        }

        return getItemView(position, convertView, holder);
    }
    //一种新的ViewHolder的写法,之所以这么写,是为了方便
    //实现类获取ConvertView中的子view ,HolderView的缓存机制
    //使用SparseArray进行缓存
    public class ViewHolder{
        private SparseArray<View> views = new SparseArray<View>();
        private View convertView;
        public ViewHolder(View convertView) {
            this.convertView = convertView;
        }
        @SuppressWarnings("unchecked")
        public <T extends View> T getView(int resId) {
            View v = views.get(resId);
            if(v == null) {
                v = convertView.findViewById(resId);
                views.put(resId, v);
            }
            return (T) v;
        }
    }
}
SimpleBaseAdapter其实就是对适配器的一种抽象,并且这个抽象类的不同表现用抽象方法

实现,因为实现类必须要实现抽象方法(也可以说实现类是根据抽象方法表现出不同的属性)

SimpleBaseAdapter的实现类:

public class myAdapter extends SimpleBaseAdapter<String> {
    public myAdapter(Context context,List<String> data){
        super(context, data);
    }
    @Override
    public int getItemRsouce() {
        return R.layout.list_item;  //返回次实现类的列表item的xml文件id
    }
    //根据id获取view(每个实现类的id都不一样)
    @Override
    public View getItemView(final int position, View convertView, ViewHolder holder) {
        TextView tv = holder.getView(R.id.title);
        tv.setText((String) getItem(position));
        Button btn = holder.getView(R.id.btn);
        btn.setText("选择");
        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(myAdapter.this.context, "" + position, Toast.LENGTH_SHORT).show();
            }
        });

        return convertView;
    }
}


  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值