重新封装BaseAdapter,打造最简洁框架

来源:互联网 发布:计算机编程课程 编辑:程序博客网 时间:2024/06/05 12:30

public abstract class MyBaseAdapter<T> extends BaseAdapter {    protected  Context context;    protected  List<T> list;    protected LayoutInflater inflater;    private final SparseArray<View> views;    public MyBaseAdapter(Context context, List<T> list) {        this.context = context;        this.list = list;        inflater = LayoutInflater.from(context);        this.views = new SparseArray<>();    }    public void updateData(List<T> list) {        this.list = list;    }    public void clear() {        this.list.clear();        notifyDataSetChanged();    }    public void addAll(List<T> list) {        if (list != null) {            this.list.addAll(list);            notifyDataSetChanged();        }    }    @Override    public int getCount() {        return list == null ? 0 : list.size();    }    @Override    public T getItem(int position) {        return list.get(position);    }    @Override    public long getItemId(int position) {        return position;    }    @Override    public View getView(int position, View convertView, ViewGroup parent) {        if(null == convertView) {            convertView = createView(inflater);        }        updateView(convertView, position, getItem(position));        return convertView;    }    public static class ViewHolder {        /**         * 减少代码重用,静态获取控件方法         * @param view         * @param id         * @param <T>         * @return         */        @SuppressWarnings("unchecked")        public static <T extends View> T get(View view, int id) {            SparseArray<View> viewHolder = (SparseArray<View>) view.getTag();            if (viewHolder == null) {                viewHolder = new SparseArray<View>();                view.setTag(viewHolder);            }            View childView = viewHolder.get(id);            if (childView == null) {                childView = view.findViewById(id);                viewHolder.put(id, childView);            }            return (T) childView;        }    }    /**     * 创建View     * @param inflater     * @return     */    abstract View createView(LayoutInflater inflater);    /**     * 更新View     * @param view     * @param position     * @param data     */    abstract void updateView(View view, int position, T data);}

以上。

更新数据、清除数据、添加数据的方法自不用说,里面核心就是getView方法的重新构造,其中里面createView的抽象方法用于创建View,返回一个布局界面,里面添加一句代码就行

@Overridepublic View createView(LayoutInflater inflater) {    return inflater.inflate(R.layout.listview_order_item, null);}
updateView方法用于写里面的数据填充,当然在原来架构里面的获取控件的Viewholder要在这个方法里进行构建,由于每一个子类Adapter的ViewHolder都各不一样,所以我想了个办法通过ViewHolder里的静态方法

        public static <T extends View> T get(View view, int id) {            SparseArray<View> viewHolder = (SparseArray<View>) view.getTag();            if (viewHolder == null) {                viewHolder = new SparseArray<View>();                view.setTag(viewHolder);            }            View childView = viewHolder.get(id);            if (childView == null) {                childView = view.findViewById(id);                viewHolder.put(id, childView);            }            return (T) childView;        }
来直接获取所需要的View,然后进行填充数据

@Overridevoid updateView(View view, int position, OrderEntity data) {    TextView tv_order_item_id, tv_order_item_name, tv_order_item_time;    tv_order_item_id = ViewHolder.get(view, R.id.tv_order_item_id);    tv_order_item_id.setText("大保健特价");    tv_order_item_name = ViewHolder.get(view, R.id.tv_order_item_name);    tv_order_item_name.setText("马国清");}
其中所有Item的Viewholder对象用SparseArray对象来进行存储,从而实现对象的复用性。

简单介绍一下SparseArray,由于SDK升级之后HashMap被建议替换SparseArray使用,简单的来说就是SparseArray具有更高的效率,它是使用二分法进行存储数据的。详细可参考http://blog.csdn.net/xyz_fly/article/details/7931943。



0 0
原创粉丝点击