鸿蒙开发之BaseAdapter封装

简介: 鸿蒙开发之BaseAdapter封装

背景

android的Listview,在鸿蒙中对应的是ListContainer,Android的adapter在鸿蒙中对应的是RecycleItemProvider,手机开发必然离不来列表数据,为了简洁代码高效开发,封装RecycleItemProvider便提上了日程,目前笔者正在实战开发项目,所踩过的坑与经验与大家分享一下,帮助大家更好的入坑鸿蒙,希望早日鸿蒙生态圈形成。



使用方法
一、设置图片 holder.setBackgroundRes(ResourceTable.Id_Component, ResourceTable.Media_icon);
二、控件显示隐藏 holder.setVisible(ResourceTable.Id_Component, false);
三、控件显示隐藏 holder.setInvisible(ResourceTable.Id_Component, true);
四、设置显示文字 holder.setText(ResourceTable.Id_Component, item.getTitle());
五、设置监听 holder.setClickedListener(ResourceTable.Id_Component, new Component.ClickedListener() {);
六、后续继续新增方法


封装后如何使用
OftenSeeAdapter   mOftenSeeAdapter = new OftenSeeAdapter(mContext, mOftenSeeBean, ResourceTable.Layout_item_often_see);
mListContainerOftenSee.setItemProvider(mOftenSeeAdapter);
Provider写法
public class OftenSeeAdapter extends RecycleItemProviderAdapter<String> {
    public OftenSeeAdapter(Context context, List<String> datas, int layoutId) {
        super(context, datas, layoutId);
    }
    @Override
    public void convert(ViewHolder holder, String s) {
    }
}

相比原代码阅读性立马提升了很多,布局复用也已处理,目前笔者只把常用的属性添加到了ViewHolder中,其他需要的自行添加,以后笔者会继续完善

代码如下,

RecycleItemProviderAdapter如下

/**
*qq群 : 1084365075
 * author : liupeng
 * date   : 2021/1/6
 * desc   : adapter基类封装
 */
public abstract class RecycleItemProviderAdapter<T> extends BaseItemProvider {
    protected Context mContext;
    protected List<T> mDatas;
    protected LayoutScatter mInflater;
    public int layoutId;
    private int displayCount;
    public RecycleItemProviderAdapter(Context context, List<T> datas) {
        this.mContext = context;
        this.mDatas = datas;
        mInflater = LayoutScatter.getInstance(mContext);
    }
    public RecycleItemProviderAdapter(Context context, List<T> datas, int layoutId) {
        this.mContext = context;
        this.mDatas = datas;
        this.layoutId = layoutId;
        mInflater = LayoutScatter.getInstance(mContext);
    }
    @Override
    public int getCount() {
        if (displayCount != 0) {
            return this.displayCount;
        }
        return mDatas.size();
    }
    public void setDisplayCount(int displayCount) {
        this.displayCount = displayCount;
    }
    @Override
    public T getItem(int position) {
        return mDatas.get(position);
    }
    @Override
    public long getItemId(int position) {
        return position;
    }
    @Override
    public Component getComponent(int position, Component convertView, ComponentContainer parent) {
        ViewHolder holder = ViewHolder.get(mContext, convertView, parent,
                layoutId, position);
        convert(holder, getItem(position));
        return holder.getConvertView();
    }
    public List<T> getDatas() {
        return mDatas;
    }
    public void setDatas(List<T> datas) {
        mDatas = datas;
    }
    public abstract void convert(ViewHolder holder, T t);
}

ViewHolder 类

/**
 * qq群 : 1084365075
 * author : liupeng
 * date   : 2021/1/6
 * desc   : 适配adapter的viewHolder
 */
public class ViewHolder {
    private HashMap<Integer, Component> mViews;
    private int mPosition;
    private Component mConvertView;
    private Context mContext;
    private int mLayoutId;
    public ViewHolder(Context context, ComponentContainer parent, int layoutId, int position) {
        mContext = context;
        mLayoutId = layoutId;
        this.mPosition = position;
        this.mViews = new HashMap<>();
        mConvertView = LayoutScatter.getInstance(mContext).parse(layoutId, null, false);
        mConvertView.setTag(this);
    }
    public static ViewHolder get(Context context, Component convertView,
                                 ComponentContainer parent, int layoutId, int position) {
        if (convertView == null) {
            return new ViewHolder(context, parent, layoutId, position);
        } else {
            ViewHolder holder = (ViewHolder) convertView.getTag();
            holder.mPosition = position;
            return holder;
        }
    }
    public int getPosition() {
        return mPosition;
    }
    public int getLayoutId() {
        return mLayoutId;
    }
    /**
     * 通过viewId获取控件
     *
     * @param viewId
     * @return
     */
    public <T extends Component> T getView(int viewId) {
        Component view = mViews.get(viewId);
        if (view == null) {
            view = mConvertView.findComponentById(viewId);
            mViews.put(viewId, view);
        }
        return (T) view;
    }
    public Component getConvertView() {
        return mConvertView;
    }
    /**
     * 设置TextView的文本
     *
     * @param viewId
     * @param text
     * @return
     */
    public ViewHolder setText(int viewId, String text) {
        Text tv = getView(viewId);
        tv.setText(text);
        return this;
    }
    public ViewHolder setTextColor(int viewId, int colorid) {
        Text tv = getView(viewId);
        tv.setTextColor(ResUtil.getNewColor(mContext,colorid));
        return this;
    }
    public ViewHolder setTextSize(int viewId, int size) {
        Text tv = getView(viewId);
        tv.setTextSize(size, Text.TextSizeType.FP);
        return this;
    }
    /**
     * @param url
     * @return
     */
    public ViewHolder setImage(int viewId, String url) {
        Image image = getView(viewId);
        GlideUtils.getInstance().displayImage(mContext, url, image);
        return this;
    }
    /**
     * 设置背景
     *
     * @param viewId
     * @param resId
     * @return
     */
    public ViewHolder setBackgroundRes(int viewId, int resId) {
        Component component = getView(viewId);
        component.setBackground(ResUtil.getPixelMapDrawable(component.getContext(), resId));
        return this;
    }
    /**
     * 设置image图片
     *
     * @param viewId
     * @param resId
     * @return
     */
    public ViewHolder setImageRes(int viewId, int resId) {
        Image image = getView(viewId);
        image.setImageElement(ResUtil.getPixelMapDrawable(image.getContext(), resId));
        return this;
    }
    /**
     * 设置显示隐藏
     *
     * @param viewId
     * @param visible
     * @return
     */
    public ViewHolder setVisible(int viewId, boolean visible) {
        Component view = getView(viewId);
        view.setVisibility(visible ? Component.VISIBLE : Component.HIDE);
        return this;
    }
    /**
     * 设置显示隐藏
     *
     * @param viewId
     * @param invisible
     * @return
     */
    public ViewHolder setInvisible(int viewId, boolean invisible) {
        Component view = getView(viewId);
        view.setVisibility(invisible ? Component.VISIBLE : Component.INVISIBLE);
        return this;
    }
    /**
     * 设置圆角
     *
     * @param viewId
     * @param radius
     * @return
     */
    public ViewHolder setCornerRadius(int viewId, int radius) {
        Image view = getView(viewId);
        view.setCornerRadius(DisplayUtils.vp2px(mContext, radius));
        return this;
    }
    /**
     * 设置圆角
     *
     * @param viewId
     * @param left
     * @param top
     * @param right
     * @param bottom
     * @return
     */
    public ViewHolder setCornerRadii(int viewId, int left, int top, int right, int bottom) {
        float[] floats = {
                DisplayUtils.vp2px(mContext, left),
                DisplayUtils.vp2px(mContext, left),
                DisplayUtils.vp2px(mContext, top),
                DisplayUtils.vp2px(mContext, top),
                DisplayUtils.vp2px(mContext, right),
                DisplayUtils.vp2px(mContext, right),
                DisplayUtils.vp2px(mContext, bottom),
                DisplayUtils.vp2px(mContext, bottom),
        };
        Image view = getView(viewId);
        view.setCornerRadii(floats);
        return this;
    }
    /**
     * 关于事件
     */
    public ViewHolder setClickedListener(int viewId, Component.ClickedListener listener) {
        Component view = getView(viewId);
        view.setClickedListener(listener);
        return this;
    }
    public ViewHolder setTouchEventListener(int viewId, Component.TouchEventListener listener) {
        Component view = getView(viewId);
        view.setTouchEventListener(listener);
        return this;
    }
    public ViewHolder setLongClickedListener(int viewId, Component.LongClickedListener listener) {
        Component view = getView(viewId);
        view.setLongClickedListener(listener);
        return this;
    }
    public ViewHolder setDoubleClickedListener(int viewId, Component.DoubleClickedListener listener) {
        Component view = getView(viewId);
        view.setDoubleClickedListener(listener);
        return this;
    }
}


相关文章
|
3月前
|
安全 JavaScript API
鸿蒙开发核心要素
鸿蒙开发核心要素
|
4月前
|
存储 IDE 定位技术
【HarmonyOS 5】鸿蒙组件&模板服务详解 - 助力高效开发的利器
在移动应用开发领域,效率与质量始终是开发者追求的核心目标。鸿蒙系统作为新兴的操作系统,为开发者提供了丰富且强大的开发资源,其中鸿蒙组件&模板服务更是成为开发者快速构建高质量应用的得力助手。
145 0
|
27天前
|
存储 缓存 5G
鸿蒙 HarmonyOS NEXT端云一体化开发-云存储篇
本文介绍用户登录后获取昵称、头像的方法,包括通过云端API和AppStorage两种方式,并实现上传头像至云存储及更新用户信息。同时解决图片缓存问题,添加上传进度提示,支持自动登录判断,提升用户体验。
99 0
|
27天前
|
存储 负载均衡 数据库
鸿蒙 HarmonyOS NEXT端云一体化开发-云函数篇
本文介绍基于华为AGC的端云一体化开发流程,涵盖项目创建、云函数开通、应用配置及DevEco集成。重点讲解云函数的编写、部署、调用与传参,并涉及环境变量设置、负载均衡、重试机制与熔断策略等高阶特性,助力开发者高效构建稳定云端服务。
224 0
鸿蒙 HarmonyOS NEXT端云一体化开发-云函数篇
|
27天前
|
存储 JSON 数据建模
鸿蒙 HarmonyOS NEXT端云一体化开发-云数据库篇
云数据库采用存储区、对象类型、对象三级结构,支持灵活的数据建模与权限管理,可通过AGC平台或本地项目初始化,实现数据的增删改查及端侧高效调用。
75 0
|
27天前
|
存储 开发者 容器
鸿蒙 HarmonyOS NEXT星河版APP应用开发-ArkTS面向对象及组件化UI开发使用实例
本文介绍了ArkTS语言中的Class类、泛型、接口、模块化、自定义组件及状态管理等核心概念,并结合代码示例讲解了对象属性、构造方法、继承、静态成员、访问修饰符等内容,同时涵盖了路由管理、生命周期和Stage模型等应用开发关键知识点。
169 0
鸿蒙 HarmonyOS NEXT星河版APP应用开发-ArkTS面向对象及组件化UI开发使用实例
|
27天前
鸿蒙 HarmonyOS NEXT星河版APP应用开发-阶段三
本文介绍了UI开发中的样式复用与组件构建技术,涵盖@Extend、@Styles和@Builder的使用方法,并通过Swiper轮播、Scroll滚动、Tabs导航等常用组件实现典型界面效果,结合生肖抽卡、小米轮播、回顶按钮等案例,展示实际应用技巧。
81 0
|
27天前
鸿蒙 HarmonyOS NEXT星河版APP应用开发-阶段二
本文介绍鸿蒙应用界面开发中的弹性布局(Flex)、绝对定位、层叠布局及ArkTS语法进阶,涵盖字符串拼接、类型转换、数组操作、条件与循环语句,并结合B站视频卡、支付宝首页等案例,深入讲解点击事件、状态管理与界面交互功能。
99 0
鸿蒙 HarmonyOS NEXT星河版APP应用开发-阶段二
|
16天前
|
传感器 监控 安全
HarmonyOS NEXT 5.0 的星闪(NearLink)开发应用案例
V哥分享HarmonyOS NEXT 5.0星闪开发实战,涵盖智能车钥匙无感解锁与工业传感器监控。低延迟、高可靠,代码完整,速来学习!
152 0
|
3月前
|
存储 SQL 前端开发
跟老卫学HarmonyOS开发:ArkTS关系型数据库开发
本节以“账本”为例,使用关系型数据库接口实现账单的增、删、改、查操作。通过创建ArkTSRdb应用,演示如何操作RdbStore进行数据管理,并结合界面按钮实现交互功能。
136 0
跟老卫学HarmonyOS开发:ArkTS关系型数据库开发