鴻蒙開發(fā)之BaseAdapter封裝

哪個小可愛在偷偷的看我~~


偷瞄.gif

背景

android的Listview,在鴻蒙中對應的是ListContainer,Android的adapter在鴻蒙中對應的是RecycleItemProvider垒棋,手機開發(fā)必然離不來列表數據拖刃,為了簡潔代碼高效開發(fā)薯演,封裝RecycleItemProvider便提上了日程贸诚,目前筆者正在實戰(zhàn)開發(fā)項目耻姥,所踩過的坑與經驗與大家分享一下销钝,幫助大家更好的入坑鴻蒙,希望早日鴻蒙生態(tài)圈形成琐簇。



使用方法
一萨脑、設置圖片 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());
五、設置監(jiān)聽 holder.setClickedListener(ResourceTable.Id_Component, new Component.ClickedListener() {);
六丈秩、后續(xù)繼續(xù)新增方法
封裝后如何使用
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中蘑秽,其他需要的自行添加饺著,以后筆者會繼續(xù)完善

代碼如下,

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閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現場離奇詭異汤求,居然都是意外死亡俏险,警方通過查閱死者的電腦和手機,發(fā)現死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進店門扬绪,熙熙樓的掌柜王于貴愁眉苦臉地迎上來竖独,“玉大人,你說我怎么就攤上這事挤牛∮。” “怎么了?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵墓赴,是天一觀的道長竞膳。 經常有香客問我,道長诫硕,這世上最難降的妖魔是什么坦辟? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮章办,結果婚禮上锉走,老公的妹妹穿的比我還像新娘滨彻。我一直安慰自己,他們只是感情好挪蹭,可當我...
    茶點故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布亭饵。 她就那樣靜靜地躺著梁厉,像睡著了一般冬骚。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上懂算,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天只冻,我揣著相機與錄音,去河邊找鬼计技。 笑死喜德,一個胖子當著我的面吹牛,可吹牛的內容都是我干的垮媒。 我是一名探鬼主播舍悯,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼睡雇!你這毒婦竟也來了萌衬?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤它抱,失蹤者是張志新(化名)和其女友劉穎秕豫,沒想到半個月后,有當地人在樹林里發(fā)現了一具尸體观蓄,經...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡混移,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現自己被綠了侮穿。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片歌径。...
    茶點故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖亲茅,靈堂內的尸體忽然破棺而出回铛,到底是詐尸還是另有隱情,我是刑警寧澤克锣,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布茵肃,位于F島的核電站,受9級特大地震影響娶耍,放射性物質發(fā)生泄漏免姿。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一榕酒、第九天 我趴在偏房一處隱蔽的房頂上張望胚膊。 院中可真熱鬧故俐,春花似錦、人聲如沸紊婉。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽喻犁。三九已至槽片,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間肢础,已是汗流浹背还栓。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留传轰,地道東北人剩盒。 一個月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像慨蛙,于是被迫代替她去往敵國和親辽聊。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,916評論 2 344

推薦閱讀更多精彩內容