鸿蒙开发之BaseAdapter封装

哪个小可爱在偷偷的看我~~


偷瞄.gif

背景

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;
    }

}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,015评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,262评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,727评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,986评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,363评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,610评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,871评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,582评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,297评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,551评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,053评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,385评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,035评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,079评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,841评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,648评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,550评论 2 270

推荐阅读更多精彩内容