BaseAdapter的简单封装

继承BaseAdapter的抽象类(根据需求进行添加方法):

public abstract class MyBaseAdapter<T> extends BaseAdapter{

    public List<T> list;
    public Context context;

    public MyBaseAdapter(Context context,List<T> list) {
        this.list = list;
        this.context = context;
    }

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

    @Override
    public Object 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) {
        //实现抽象方法创建ViewHolder,并返回ViewHolder执行getItemView方法返回的视图
        return createViewHoler(position, convertView, parent).getItemView();
    }

    /**
     * 创建ViewHolder的抽象方法
     * @param position
     * @param convertView
     * @param parent
     * @return
     */
    public abstract ViewHolder createViewHoler(int position, View convertView, ViewGroup parent);

    /**
     * ViewHolder类
     */
    public static class ViewHolder {
        private View convertView;
        //保存View的map
        private HashMap<Integer, View> views;
        private Context context;

        /**
         *第四步:ViewHolder的私有构造器
         */
        private ViewHolder(Context context, View convertView) {
            this.convertView = convertView;
            this.views = new HashMap<>();
            this.context = context;
            //设置tag
            convertView.setTag(this);
        }

        /**
         *第三步:提供给外界获取ViewHolder的方法(使用优化重用布局)
         */
        public static ViewHolder getHolder(View convertView, Context context, int layoutId, ViewGroup parent) {
            if (convertView == null) {
                LayoutInflater inflater = LayoutInflater.from(context);
                convertView = inflater.inflate(layoutId, parent, false);
                return new ViewHolder(context, convertView);
            } else {
                return (ViewHolder) convertView.getTag();
            }
        }

        /**
         * findById方法
         * @param id
         * @param <T>
         * @return
         */
        public <T extends View> T findById(int id) {
            View view = views.get(id);
            if (view == null) {
                view = convertView.findViewById(id);
                views.put(id, view);

            } else {
                view = views.get(id);
            }
            return (T) view;
        }

        /**
         * 设置TextView文本方法
         * @param id
         * @param txt
         */
        public void setText(int id, String txt) {
            TextView tv = findById(id);
            tv.setText(txt);
        }

        /**
         * 返回整个视图
         * @return
         */
        public View getItemView() {
            return convertView;
        }
    }
}

继承封装的适配器代码:

public class TestAdapter extends MyBaseAdapter{

    private List<String> list;
    protected Context context;

    public TestAdapter(Context context, List<String> list) {
        super(context, list);
        this.list = list;
        this.context = context;
    }

    /**
     * 第二步
     * @param position
     * @param convertView
     * @param parent
     * @return
     */
    @Override
    public ViewHolder createViewHoler(int position, View convertView, ViewGroup parent) {
        ViewHolder holder = ViewHolder.getHolder(convertView,context, R.layout.simple_fragment,parent);
        //findById方法
        TextView tv = holder.findById(R.id.tv_sp_fm);
        //设置TextView文本方法
        holder.setText(R.id.tv_sp_fm,list.get(position));
        return holder;
    }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
BaseAdapter是Android开发中的一个抽象类,用于创建自定义适配器。适配器是连接数据和UI界面的桥梁,它负责将数据源中的数据逐个绑定到UI组件上,以展示给用户。BaseAdapter提供了一些方法,可以帮助我们实现自定义适配器。 以下是一个使用BaseAdapter创建自定义适配器的示例代码: ```java public class MyAdapter extends BaseAdapter { private Context mContext; private List<String> mData; public MyAdapter(Context context, List<String> data) { mContext = context; mData = data; } @Override public int getCount() { return mData.size(); } @Override public Object getItem(int position) { return mData.get(position); } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { ViewHolder holder; if (convertView == null) { convertView = LayoutInflater.from(mContext).inflate(R.layout.item_layout, parent, false); holder = new ViewHolder(); holder.textView = convertView.findViewById(R.id.text_view); convertView.setTag(holder); } else { holder = (ViewHolder) convertView.getTag(); } String item = mData.get(position); holder.textView.setText(item); return convertView; } private static class ViewHolder { TextView textView; } } ``` 在这个示例中,我们创建了一个名为MyAdapter的自定义适配器,继承BaseAdapter。在构造方法中,我们传入了上下文和数据源。然后,我们实现了BaseAdapter的四个方法:getCount()、getItem()、getItemId()和getView()。 - getCount()方法返回数据源的大小。 - getItem()方法返回指定位置的数据项。 - getItemId()方法返回指定位置的数据项的ID。 - getView()方法用于创建每个列表项的视图,并将数据绑定到视图上。 在getView()方法中,我们使用了ViewHolder模式来优化列表项的创建和复用。通过convertView参数判断是否需要创建新的视图,如果convertView为null,则创建新的视图,并将其缓存到ViewHolder中;如果convertView不为null,则直接从缓存中获取ViewHolder。然后,我们从数据源中获取对应位置的数据项,并将其绑定到视图上。 这样,我们就可以使用自定义的适配器MyAdapter来展示数据了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值