天天看點

通用元件示例

實作一個需求很容易,難的是代碼的架構,我們應該讓它後期的維護變得簡單

titlebar

base初始化
private void initBar(TitleBar titleBar) {
    StatusBarManager.translucentStatusBar(this, titleBar);

    // set the default click listener
    titleBar.setLeftClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            onBackPressed();
        }
    });
    titleBar.setLeftImageResource(R.drawable.img_black_back);
    titleBar.setTitleColor(Color.WHITE);
    //預設給一個白色的背景
    titleBar.setBackgroundColor(Color.WHITE);
    titleBar.setSubTitleColor(Color.WHITE);
    titleBar.setDividerColor(Color.GRAY);
    titleBar.setActionTextColor(Color.WHITE);
    titleBar.setDividerHeight(0);

}
           

沉浸式

  • 支援版本碎片化
  • dark模式和fragment之前的dark模式切換,這是自動的(在父類排程)
  • MIUI FLYME等深度定制系統,版本查詢和定制話代碼需要到官網查詢

dark模式自動切換的原理

  • 取色器bitmap-palette
  • pix像素點色值
  • 複寫titlebar#setbackground()

loadingHelper

https://www.jianshu.com/p/6a55a888fe58

Activity/Fragment中使用

private void updateCityInfo(Cities.City city) {
        mCity = city;
        getTitleBar().setLeftText(city.name);
        //發起網絡加載中 
        getLoadingHelper().showLoadingView();
        ViewModelProviders.of(this).get(HomeModuleViewModule.class)
                .loadHomeModule();
    }

 getLoadingHelper().addRetryListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                    //網絡錯誤添加action
                getLoadingHelper().showLoadingView();
                ViewModelProviders.of(HomeTabFragment.this).get(HomeModuleViewModule.class).loadHomeModule();
            }
        });
 ViewModelProviders.of(this).get(HomeModuleViewModule.class).getHomeModule()
                .observe(this, new Observer<HomeModule>() {
                    @Override
                    public void onChanged(@Nullable HomeModule homeModule) {
                        if (homeModule == null) {
                                //網絡回調後錯誤
                            getLoadingHelper().showNetworkError();
                        } else {
                                //網絡回調後成功
                            getLoadingHelper().showContentView();
                            updateHomeViews(layout_ll_content, homeModule);
                            if (PUSH_TYPE_REPORT_FROM_HOME) {
                                PUSH_TYPE_REPORT_FROM_HOME = false;
                                CreditServiceHelper
                                        .doHomeNextJumpFor(getActivity(), mHeaderView);

                            }
                        }
                    }
                });

           

ViewModel和View-Layout應用

https://www.jianshu.com/p/9dda86b99bcf
ViewModelProviders.of(this).get(CreditCardViewModel.class).getLiveData()
                .observe(this, new Observer<CreditlistV102>() {
                    @Override
                    public void onChanged(@Nullable CreditlistV102 creditlistV102) {
                        if (creditlistV102 != null) {
                            getLoadingHelper().showContentView();
                            buildViews(creditlistV102);
                        } else {
                            getLoadingHelper().showNetworkError();
                        }
                    }
                });

ViewModelProviders.of(this).get(CreditCardViewModel.class).load();
getLoadingHelper().showLoadingView();

public void buildViews(CreditlistV102 creditlistV102) {
    buildBanksView(creditlistV102.bankList);
    buildMidTitleView(creditlistV102.cardTitle);
    buildViewPagers(creditlistV102.tag_list);

}

private void buildBanksView(List<CreditlistV102.BankListBean> bankList) {

    llHeader.addView(new GridHeadView(getContext(), bankList));

}
//分割的view
@BindLayout(R.layout.credit_card_headerview)
static class GridHeadView extends BaseItemViewWithBean<List<CreditlistV102.BankListBean>> {

    @BindView(R.id.grid_view)
    NoScrollGridView gridView;
    @BindView(R.id.icon_bank_bottom)
    View iconBankBottom;
    @BindView(R.id.ll_spilt)
    LinearLayout llSpilt;

    boolean mIsExpend;

    public GridHeadView(Context context, List<CreditlistV102.BankListBean> data) {
        super(context, data);
    }

    @Override
    protected void onViewCreated(View view, final List<CreditlistV102.BankListBean> bean) {
        final GridHeadAdapter adapter = new GridHeadAdapter(getContext());
        gridView.setAdapter(adapter);
    }
}
//adapter
static class GridHeadAdapter extends BaseListAdapter<CreditlistV102.BankListBean> {

    public GridHeadAdapter(Context context) {
        super(context);
    }

    @Override
    protected void onBindViewHolder(List<Class<? extends BaseViewHolder<CreditlistV102.BankListBean>>>
                                            viewHolderList) {
        viewHolderList.add(ViewHolder.class);
    }
//ViewHolder
    @BindLayout(R.layout.viewholder_card_view_header_banks)
    static class ViewHolder extends BaseViewHolder<CreditlistV102.BankListBean> {

        @BindView(R.id.img_top)
        ImageView imgTop;
        @BindView(R.id.tv_name)
        TextView tvName;

        @Override
        protected void bindView(final CreditlistV102.BankListBean bean, int position, final Context context) {
            ImageLoader.host(context).load(bean.image, imgTop);
            tvName.setText(bean.name);
            imgTop.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    CreditBankDetailActivity.invoke(context, bean.id);
                }
            });

        }
    }
}

    private void buildViewPagers(List<String> cardList) {
        viewPager.setAdapter(new CreditCardViewPagerAdapter(getChildFragmentManager(), cardList));
        viewPager.setOffscreenPageLimit(cardList.size() - 1);
        tabLayout.setupWithViewPager(viewPager);
        UIUtil.reflex(tabLayout, 20);
    }



 
           

RxBus

tag

tags

Model

等可以自定義多個緯度

Action 事件源tag
public interface RxBusAction {
    String MAIN_HOME_REFRESH = "main_home_refresh";
    String ON_APP_LOGOUT = "on_app_logout";
    String ON_APP_LOGIN = "on_app_login";
    String ON_CITY_CHANGED = "on_city_changed";

}

消息體
public class RxBusMsg<T> implements Serializable {
    public String tag;
    public T value;

    /**
     * @param value 當value為空時必須傳入泛型的類型
     */
    public RxBusMsg(@NonNull T value) {
        this.value = value;
    }

    public RxBusMsg<String> obtainMsg(String msg) {
        return new RxBusMsg<>(msg);
    }
}
響應體注解
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface Subscribe {
    Tag[] tags() default {};

    String tag() default "";

    EventThread thread() default EventThread.MAIN_THREAD;
}
           
https://www.jianshu.com/p/18e420291d4e

網絡庫

public interface ApiBus {
    /**
     * 首頁
     *
     * @return
     */
    @Url(BASIC_URL + "index/indexv100")
    Single<HomeModule> loadHome();

    /**
     * App啟動接口
     *
     * @param newUserOpen
     *
     * @return
     */
    @Url(BASIC_URL + "config/StartV100")
    Single<String> appStart(@Field("new_user_open") String newUserOpen);
    
     /**
     * 請求同步資料
     *
     * @return
     */
    @Security(PRIVATE_CRYPT)
    @Url(BASIC_URL + "account/SyncV100")
    Single<SyncData> LOGIN_SYNC();

}
獲得rx被觀察者的對象
 JtRetrofit.create(ApiBus.class).loadHome();
見VM模式
           

繼續閱讀