天天看点

Android通用适配器

相信有Android开发经验的同仁,开发项目时写ListView、GridView的适配器最多,并且做得都是重复的工作,这就要求我们对适配器进行封装。

下面我就直接贴上代码了,布局文件都一个样,我就不贴了。

/**
 * 通用适配器(Universal BaseAdapter)
 * 
 * 1、第二个构造方法:ArrayAdapter源码构造方法写法
 * 2、同时适配器增加了添加数据、移除数据等方法
 * 
 * @author linvisf
 *
 * @param <T>
 */
public abstract class UBaseAdapter<T> extends BaseAdapter {

    private Context context;
    private List<T> list;

    //提供两种常用数据源的构造方法
    public UBaseAdapter(Context context, List<T> list){
        this.context = context;
        this.list = list;
    }

    public UBaseAdapter(Context context, T[] dataArray){
        this.context = context;
        this.list = Arrays.asList(dataArray);
    }

    @Override
    public int getCount() {
        if (list != null)
            return list.size();
        return ;
    }

    @Override
    public T getItem(int position) {
        return list.get(position);
    }

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

    /**返回item布局的resource id*/
    public abstract int getItemLayoutResId();

    public abstract View bindView(View convertView, int position, ViewHolder holder);

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder holder;
        if (null == convertView) {
            convertView = View.inflate(context, getItemLayoutResId(), null);
            holder = new ViewHolder(convertView);
            convertView.setTag(holder);
        } else {
            holder = (ViewHolder) convertView.getTag();
        }
        return bindView(convertView, position, holder);
    }

    /**
     * ViewHolder
     * @author linvisf
     */
    public class ViewHolder {
        private SparseArray<View> views = new SparseArray<View>();
        private View convertView;

        public ViewHolder(View convertView) {
            this.convertView = convertView;
        }

        @SuppressWarnings({ "unchecked", "hiding" })
        public <T extends View> T getView(int resId) {
            View v = views.get(resId);
            if (null == v) {
                v = convertView.findViewById(resId);
                views.put(resId, v);
            }
            return (T) v;
        }
    }


    public List<T> getList(){
        return list;
    }

    public void add(T t){
        list.add(t);
        notifyDataSetChanged();
    }

    public void addAll(List<T> t){
        list.addAll(t);
        notifyDataSetChanged();
    }

    public void set(T oldT, T newT){
        set(list.indexOf(oldT), newT);
    }

    public void set(int index, T t){
        list.set(index, t);
        notifyDataSetChanged();
    }

    public void remove(T t){
        list.remove(t);
        notifyDataSetChanged();
    }

    public void remove(int index){
        list.remove(index);
        notifyDataSetChanged();
    }

    public boolean contains(T t){
        return list.contains(t);
    }
}
           

以上代码就是通用适配器工具,下面是如何调用我们通用适配器:

a、写在目标activity部分代码

//使用ArrayList<T> 和数组数据源一样,只是构造方法不同而已
        String[] mDatas = new String[]{"android", "ios","java","web","sqlite","javascript"};
        SimpleListAdapter adapter = new SimpleListAdapter(this, mDatas);

        ListView mListView = (ListView) findViewById(R.id.listview1);
        mListView.setAdapter(adapter);
           

b、写个适配器SimpleListAdapter 继承UBaseAdapter,如下:

public class SimpleListAdapter extends UBaseAdapter<String> {

    //如果是List数据源,则使用SimpleListAdapter(Context context, List<String> list)
    public SimpleListAdapter(Context context, String[] dataArray) {
        super(context, dataArray);
    }

    @Override
    public int getItemLayoutResId() {
        return R.layout.item_pop;
    }

    @Override
    public View bindView(View convertView, int position, ViewHolder holder) {
        //适配器布局中有多少个控件,都调用ViewHolder.getView(id)即可
        TextView tv_label = holder.getView(R.id.tv_label);
        tv_label.setText(getItem(position));
        return convertView;
    }

}
           

到此Android通用适配器写完,如那里写得不好,请大家多多见谅、指正。