鸿蒙开发之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;
    }
}


相关文章
|
26天前
|
JavaScript 安全 前端开发
【HarmonyOS开发】ArkTS基础语法及使用(鸿蒙开发基础教程)
【HarmonyOS开发】ArkTS基础语法及使用(鸿蒙开发基础教程)
283 4
|
2天前
|
索引
鸿蒙开发:ForEach中为什么键值生成函数很重要
在列表组件使用的时候,如List、Grid、WaterFlow等,循环渲染时都会使用到ForEach或者LazyForEach,当然了,也有单独使用的场景,如下,一个很简单的列表组件使用,这种使用方式,在官方的很多案例中也多次出现,相信在实际的开发中多多少少也会存在。
鸿蒙开发:ForEach中为什么键值生成函数很重要
|
25天前
|
存储 数据安全/隐私保护
鸿蒙开发:自定义一个动态输入框
在鸿蒙开发中,如何实现这一效果呢,最重要的解决两个问题,第一个问题是,如何在上一个输入框输入完之后,焦点切换至下一个输入框中,第二个问题是,如何禁止已经输入的输入框的焦点,两个问题解决完之后,其他的就很是简单了。
48 13
鸿蒙开发:自定义一个动态输入框
|
28天前
|
小程序 测试技术 API
鸿蒙原生开发手记:03-元服务开发全流程(开发元服务,只需要看这一篇文章)
本文详细介绍元服务的开发及上架全流程,涵盖元服务的特点、创建项目、服务卡片、签名打包、开发测试及上架审核等环节,帮助开发者轻松掌握从零开始开发并发布元服务的全过程。元服务以其轻量、免安装、易于使用等特点,成为未来服务提供的重要形式。
71 13
鸿蒙原生开发手记:03-元服务开发全流程(开发元服务,只需要看这一篇文章)
|
15小时前
|
数据管理 API 调度
鸿蒙HarmonyOS应用开发 | 探索 HarmonyOS Next-从开发到实战掌握 HarmonyOS Next 的分布式能力
HarmonyOS Next 是华为新一代操作系统,专注于分布式技术的深度应用与生态融合。本文通过技术特点、应用场景及实战案例,全面解析其核心技术架构与开发流程。重点介绍分布式软总线2.0、数据管理、任务调度等升级特性,并提供基于 ArkTS 的原生开发支持。通过开发跨设备协同音乐播放应用,展示分布式能力的实际应用,涵盖项目配置、主界面设计、分布式服务实现及部署调试步骤。此外,深入分析分布式数据同步原理、任务调度优化及常见问题解决方案,帮助开发者掌握 HarmonyOS Next 的核心技术和实战技巧。
40 28
鸿蒙HarmonyOS应用开发 | 探索 HarmonyOS Next-从开发到实战掌握 HarmonyOS Next 的分布式能力
|
1月前
|
Android开发
鸿蒙开发:自定义一个简单的标题栏
本身就是一个很简单的标题栏组件,没有什么过多的技术含量,有一点需要注意,当使用沉浸式的时候,注意标题栏的位置,需要避让状态栏。
鸿蒙开发:自定义一个简单的标题栏
|
1月前
|
API
鸿蒙开发:切换至基于rcp的网络请求
本文的内容主要是把之前基于http封装的库,修改为当前的Remote Communication Kit(远场通信服务),无非就是通信的方式变了,其他都大差不差。
鸿蒙开发:切换至基于rcp的网络请求
|
1月前
|
传感器 数据处理 数据库
鸿蒙开发Hvigor插件动态生成代码
【11月更文挑战第13天】Hvigor 是鸿蒙开发中的构建系统插件,主要负责项目的构建、打包及依赖管理,并能根据预定义规则动态生成代码,如数据库访问、网络请求等,提高开发效率和代码一致性。适用于大型项目初始化和组件化开发。
|
28天前
|
Android开发 索引
鸿蒙开发:自定义一个车牌省份简称键盘
鸿蒙搞起来就比较的简单,直接一个Grid组件便可以搞定,最后的删除按钮,使用布局选项GridLayoutOptions便可轻松实现。
鸿蒙开发:自定义一个车牌省份简称键盘
|
1月前
|
安全 UED 开发者
鸿蒙开发:沉浸式效果实现
沉浸式效果实现后,一定要注意安全区域的内容避让,防止内容延伸后被导航条或者状态栏遮挡,具体是选择安全区域或者窗口管理方式,按照需求进行处理,如果仅仅是某个页面,直接安全区域即可。
鸿蒙开发:沉浸式效果实现
下一篇
DataWorks