美文网首页
首页代码重构

首页代码重构

作者: 激扬飞雪 | 来源:发表于2019-06-25 15:49 被阅读0次

目标描述

  • 首页每个大的item模块受后台数据可控(item顺序、显示隐藏、title标签等)
  • 代码易升级易维护


    image

目前缺陷

  • 目前整体采用RecyclerView,最新书籍是其item,其他部分整体作为一个头部item
  • 头部item布局写死,无法通过后台可配置
  • 所有的item数据填充都在Adapter中,代码粒度过大,后期不易维护

代码改造

  • 整体采用RecyclerView,将每一种类型当做item,并将每一个类型抽象为接口,后期如再添加一个其他类型item,只要实现这个接口将这个类型布局及数据填充上即可
/**
 * 首页item
 *
 * @author kaily_zhou
 * @date 2018/11/27 下午1:46
 */
public interface IItemHome {
    public int itemLayoutId();

    public void itemData(BaseViewHolder helper, HomeModuleListInfo item);

    public void updateData(NewHomePageInfo homePageInfo, CommunityHomeInfo communityHomeInfo);
}
  • 将每个IItemHome实现类添加到HashMap中,使用时候根据后台发过来的item类型在hashmap中找到具体item实现类填充数据即可,后期如添加或者废弃某种类型的item,只要在此HashMap中添加或删除此类型item实现类即可
private Map<Integer, IItemHome> mapItem = new HashMap<>();
/**
     * 添加相应类型item
     *
     * @param type
     * @param itemHome
     */
    private void addItemHomeType(int type, IItemHome itemHome) {
        if (itemHome != null) {
            mapItem.put(type, itemHome);
            addItemType(type, itemHome.itemLayoutId());
        }
    }
/**
     * 初始化item实现类,并添加到map中去
     */
    private void initItemHome() {
        //如废弃此类型的item,只要注释掉此句即可
        addItemHomeType(HomeModuleListInfo.ITEM_TYPE_DEFAULT, new ItemHomeDefault(context, homePageInfo, communityHomeInfo));
        addItemHomeType(HomeModuleListInfo.ITEM_TYPE_WEEK_RECOMMEND, new ItemHomeWeekRecommend(context, homePageInfo, communityHomeInfo));
        addItemHomeType(HomeModuleListInfo.ITEM_TYPE_VIP, new ItemHomeVip(context, homePageInfo, communityHomeInfo));
        addItemHomeType(HomeModuleListInfo.ITEM_TYPE_EXPERIENCE, new ItemHomeExperience(context, homePageInfo, communityHomeInfo));
        addItemHomeType(HomeModuleListInfo.ITEM_TYPE_CODE_BOOK_LIST, new ItemHomeTopicalBook(context, homePageInfo, communityHomeInfo));
        addItemHomeType(HomeModuleListInfo.ITEM_TYPE_CODE_RECOMMEND_LIST, new ItemHomeRecommend(context, homePageInfo, communityHomeInfo));
        addItemHomeType(HomeModuleListInfo.ITEM_TYPE_CODE_CLASSIFY, new ItemHomeClassify(context, homePageInfo, communityHomeInfo));
        addItemHomeType(HomeModuleListInfo.ITEM_TYPE_CODE_NEW_BOOK_LIST, new ItemHomeNewBook(context, homePageInfo, communityHomeInfo));
        addItemHomeType(HomeModuleListInfo.ITEM_TYPE_CODE_BANNER_LIST, new ItemHomeBanner(context, homePageInfo, communityHomeInfo));
        addItemHomeType(HomeModuleListInfo.ITEM_TYPE_CODE_PACK_LIST,
                new ItemHomeCoursePack(context, homePageInfo, communityHomeInfo, ItemHomeCoursePack.COURSE_PACK_TYPE));
        addItemHomeType(HomeModuleListInfo.ITEM_TYPE_CODE_PACK_OPTION_LIST,
                new ItemHomeCoursePack(context, homePageInfo, communityHomeInfo, ItemHomeCoursePack.COURSE_OPT_PACK_TYPE));
    }
  //根据后台配置信息寻找具体类型填充数据
  @Override
    protected void convert(BaseViewHolder helper, HomeModuleListInfo item) {
        int itemViewType = helper.getItemViewType();
        IItemHome itemHome = getItemHomeType(itemViewType);
        if (itemHome != null && homePageInfo != null && communityHomeInfo != null && item != null && "1".equals(item.getDisplayFlag())) {
            setItemVisible(helper, View.VISIBLE);
            itemHome.itemData(helper, item);
        } else {
            setItemVisible(helper, View.GONE);
        }
    }
package com.chiyue.qiye.domain.main.home.item;


import android.content.Context;
import android.view.View;

import com.chad.library.adapter.base.BaseViewHolder;
import com.chiyue.qiye.R;
import com.chiyue.qiye.bean.CommunityHomeInfo;
import com.chiyue.qiye.bean.HomeModuleListInfo;
import com.chiyue.qiye.bean.NewHomePageInfo;

/**
 * item默认类型
 *
 * @date 2018/11/27 下午2:08
 * @author: kaily_zhou
 */
public class ItemHomeDefault extends BaseItemHome {
    public ItemHomeDefault(Context context, NewHomePageInfo homePageInfo,
                           CommunityHomeInfo communityHomeInfo) {
        super(context, homePageInfo, communityHomeInfo);
    }

    @Override
    public int itemLayoutId() {
        return R.layout.item_community_home_default;
    }

    @Override
    public void itemData(BaseViewHolder helper, HomeModuleListInfo item) {
        setItemVisible(helper, View.GONE);
    }
}

相关文章

  • 首页代码重构

    目标描述 首页每个大的item模块受后台数据可控(item顺序、显示隐藏、title标签等) 代码易升级易维护im...

  • 代码重构专题(转载)

    代码重构(一):函数重构规则代码重构(二):类重构规则代码重构(三):数据重构规则代码重构(四):条件表达式重构规...

  • 使用JavaScript实现广告图片自动切换

    重构首页广告层的HTML代码 广告层的HTML代码如下: 往广告层里面添加图片 添加广告图片的JavaScript...

  • 《重构》一书总结(二)

    《重构》一书总结(二) 重构的重点,在于对那些代码进行重构,如果重构不当,反而适得其反。 重构代码终结如下 1.D...

  • Mvc分页组件MvcSimplePager代码重构

    Mvc分页组件MvcSimplePager代码重构 Mvc分页组件MvcSimplePager代码重构1.1 In...

  • 编程的方法——重构、测试等

    重构 为什么要重构? 重构代码是保持代码质量的一个极其有效的手段,它可以避免你的代码腐化到无可救药的地步。 重构可...

  • 代码重构利器

    使用重构件(Codemod)加速 JavaScript 开发和重构代码重构利器 —— jscodeshift 对于...

  • 为什么要代码重构?如何重构?常见重构技巧

    关于重构 为什么要重构 代码重构漫画 项目在不断演进过程中,代码不停地在堆砌。如果没有人为代码的质量负责,代码总是...

  • 重构

    重构时,先梳理代码,删除无用的逻辑,进行小的消除重复代码重构,封装小方法重构,等等,目的是让大段大段代码之前的耦合...

  • 重构代码之美

    什么是重构; 为什么要重构; 什么时候重构; 怎样避免重构的现象; 重构的难点在哪里; 如何来实施代码重构; 重构...

网友评论

      本文标题:首页代码重构

      本文链接:https://www.haomeiwen.com/subject/cqfxcctx.html