android开源app简书,Android不错的开源项目

项目地址

值得借鉴的地方

项目结构(MVP+Dagger2)

Retrofit对多个baseUrl的管理

realm的使用

侧边栏导航、tab导航的使用

单Activity+多Fragment的管理(基于me.yokeyword:fragmentation)

页面跳转共享资源的使用(列表->详情共享新闻图片)

==搜索框的使用,搜索时间的发布订阅处理逻辑==

Logger的使用,见LogUtil

在Application中调用InitializeService,初始化了Logger,Bugly(错误收集+统计),LeakCanary(内存泄漏检测),BlockCanary(UI阻塞监控),tbs webview(腾讯webview服务)

解读

RxBus事件总线

DailyPresenter的构造方法中有一个registerEvent方法

@Inject

public DailyPresenter(RetrofitHelper mRetrofitHelper,RealmHelper mRealHelper) {

this.mRetrofitHelper = mRetrofitHelper;

this.mRealmHelper = mRealHelper;

registerEvent();

}

registerEvent()是订阅RxBus事件的

private void registerEvent() {

Subscription rxSubscription = RxBus.getDefault().toObservable(CalendarDay.class)

.subscribeOn(Schedulers.io())

.map(new Func1() {

...

在DailyFragment中,发布RxBus事件

swipeRefresh.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {

@Override

public void onRefresh() {

if(currentDate.equals(DateUtil.getTomorrowDate())) {

mPresenter.getDailyData();

} else {

int year = Integer.valueOf(currentDate.substring(0,4));

int month = Integer.valueOf(currentDate.substring(4,6));

int day = Integer.valueOf(currentDate.substring(6,8));

CalendarDay date = CalendarDay.from(year, month - 1, day);

RxBus.getDefault().post(date);

}

}

});

DailyAdapter

有三种样式:图片滚动栏(类似于web的banner)、日期、新闻item

@Override

public int getItemViewType(int position) {

if(!isBefore) {

if(position == 0) {

return ITEM_TYPE.ITEM_TOP.ordinal();

} else if(position == 1) {

return ITEM_TYPE.ITEM_DATE.ordinal();

} else {

return ITEM_TYPE.ITEM_CONTENT.ordinal();

}

} else {

if(position == 0) {

return ITEM_TYPE.ITEM_DATE.ordinal();

} else {

return ITEM_TYPE.ITEM_CONTENT.ordinal();

}

}

}

其中positi==0的就是图片滚动栏,由一个ViewPager实现,该ViewPager的Adapter是由另外一个Adapter持有的

@Override

public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

if(viewType == ITEM_TYPE.ITEM_TOP.ordinal()) {

mAdapter = new TopPagerAdapter(mContext,mTopList);

return new TopViewHolder(inflater.inflate(R.layout.item_top, parent, false));

} else if(viewType == ITEM_TYPE.ITEM_DATE.ordinal()) {

return new DateViewHolder(inflater.inflate(R.layout.item_date, parent, false));

}

return new ContentViewHolder(inflater.inflate(R.layout.item_daily, parent, false));

}

compose的使用

可以少写切换线程的代码

@Override

public void getDailyData() {

Subscription rxSubscription = mRetrofitHelper.fetchDailyListInfo()

.compose(RxUtil.rxSchedulerHelper())

...

}

其中的compose主要是在io线程处理数据,ui线程处理结果

/**

* 统一线程处理

* @param

* @return

*/

public static Observable.Transformer rxSchedulerHelper() { //compose简化线程

return new Observable.Transformer() {

@Override

public Observable call(Observable observable) {

return observable.subscribeOn(Schedulers.io())

.observeOn(AndroidSchedulers.mainThread());

}

};

}

新闻的item点击进入detail时会共享新闻图片

xml如下

android:id="@+id/iv_daily_item_image"

android:transitionName="shareView"

android:src="@mipmap/ic_launcher"

android:layout_width="@dimen/list_image_size"

android:layout_height="@dimen/list_image_size" />

...

java如下

mAdapter.setOnItemClickListener(new DailyAdapter.OnItemClickListener() {

@Override

public void onItemClick(int position,View shareView) {

mPresenter.insertReadToDB(mList.get(position).getId());

mAdapter.setReadState(position,true);

if(mAdapter.getIsBefore()) {

mAdapter.notifyItemChanged(position + 1);

} else {

mAdapter.notifyItemChanged(position + 2);

}

Intent intent = new Intent();

intent.setClass(mContext, ZhihuDetailActivity.class);

intent.putExtra("id",mList.get(position).getId());

ActivityOptions options = ActivityOptions.makeSceneTransitionAnimation(mActivity, shareView, "shareView");

mContext.startActivity(intent,options.toBundle());

}

});

detail中做如下处理

xml如下

android:id="@+id/app_bar"

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:transitionName="shareView"

android:fitsSystemWindows="true">

...

java如下

(getWindow().getSharedElementEnterTransition()).addListener(new Transition.TransitionListener() {

@Override

public void onTransitionStart(Transition transition) {

}

@Override

public void onTransitionEnd(Transition transition) {

/**

* 测试发现部分手机(如红米note2)上加载图片会变形,没有达到centerCrop效果

* 查阅资料发现Glide配合SharedElementTransition是有坑的,需要在Transition动画结束后再加载图片

* https://github.com/TWiStErRob/glide-support/blob/master/src/glide3/java/com/bumptech/glide/supportapp/github/_847_shared_transition/DetailFragment.java

*/

isTransitionEnd = true;

if (imgUrl != null) {

isImageShow = true;

ImageLoader.load(mContext, imgUrl, detailBarImage);

}

}

@Override

public void onTransitionCancel(Transition transition) {

}

@Override

public void onTransitionPause(Transition transition) {

}

@Override

public void onTransitionResume(Transition transition) {

}

});

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
智慧校园整体解决方案是响应国家教育信息化政策,结合教育改革和技术创新的产物。该方案以物联网、大数据、人工智能和移动互联技术为基础,旨在打造一个安全、高效、互动且环保的教育环境。方案强调从数字化校园向智慧校园的转变,通过自动数据采集、智能分析和按需服务,实现校园业务的智能化管理。 方案的总体设计原则包括应用至上、分层设计和互联互通,确保系统能够满足不同用户角色的需求,并实现数据和资源的整合与共享。框架设计涵盖了校园安全、管理、教学、环境等多个方面,构建了一个全面的校园应用生态系统。这包括智慧安全系统、校园身份识别、智能排课及选课系统、智慧学习系统、精品录播教室方案等,以支持个性化学习和教学评估。 建设内容突出了智慧安全和智慧管理的重要性。智慧安全管理通过分布式录播系统和紧急预案一键启动功能,增强校园安全预警和事件响应能力。智慧管理系统则利用物联网技术,实现人员和设备的智能管理,提高校园运营效率。 智慧教学部分,方案提供了智慧学习系统和精品录播教室方案,支持专业级学习硬件和智能化网络管理,促进个性化学习和教学资源的高效利用。同时,教学质量评估中心和资源应用平台的建设,旨在提升教学评估的科学性和教育资源的共享性。 智慧环境建设则侧重于基于物联网的设备管理,通过智慧教室管理系统实现教室环境的智能控制和能效管理,打造绿色、节能的校园环境。电子班牌和校园信息发布系统的建设,将作为智慧校园的核心和入口,提供教务、一卡通、图书馆等系统的集成信息。 总体而言,智慧校园整体解决方案通过集成先进技术,不仅提升了校园的信息化水平,而且优化了教学和管理流程,为学生、教师和家长提供了更加便捷、个性化的教育体验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值