天天看點

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通用擴充卡寫完,如那裡寫得不好,請大家多多見諒、指正。