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

本文详细介绍了如何在Android中自定义BaseAdapter,包括更新数据、清除数据、添加数据的方法,以及如何通过ViewHolder模式提高代码复用性和效率。重点阐述了如何使用SparseArray进行View对象的存储,实现对象的复用性,并通过静态方法直接获取所需的View进行填充数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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,返回一个布局界面,里面添加一句代码就行

@Override
public 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,然后进行填充数据

@Override
void 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.youkuaiyun.com/xyz_fly/article/details/7931943。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值