其简单的通用适配器的定义

连接器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;
    }
}


版权声明:本文博主原创文章,博客,未经同意不得转载。

posted @ 2015-10-11 12:33  hrhguanli  阅读(279)  评论(0编辑  收藏  举报