From 420aabbe03e30cbb2b93829337a5324c7a9ffa4e Mon Sep 17 00:00:00 2001 From: lambert Date: Fri, 30 Aug 2019 18:07:33 +0800 Subject: [PATCH] =?UTF-8?q?kotlin=E7=BC=96=E5=86=99Gank=E9=A1=B5=E9=9D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../base/assist/ConfigConstants.java | 1 + module2/src/main/AndroidManifest.xml | 3 + module2/src/main/debug/AndroidManifest.xml | 3 + .../heyongrui/module2/Module2Fragment.java | 3 + .../module2/dagger/ActivityContext.java | 12 ++ .../module2/dagger/Module2Component.java | 27 ++++ .../module2/dagger/Module2Module.java | 62 +++++++++ .../heyongrui/module2/data/api/GankApi.java | 4 +- .../module2/data/service/GankService.java | 8 +- .../module2/gank/contract/GankContract.kt | 27 ++++ .../module2/gank/presenter/GankPresenter.kt | 74 +++++++++++ .../module2/gank/view/GankActivity.kt | 119 ++++++++++++++++++ module2/src/main/res/layout/activity_gank.xml | 78 ++++++++++++ 13 files changed, 418 insertions(+), 3 deletions(-) create mode 100644 module2/src/main/java/com/heyongrui/module2/dagger/ActivityContext.java create mode 100644 module2/src/main/java/com/heyongrui/module2/dagger/Module2Component.java create mode 100644 module2/src/main/java/com/heyongrui/module2/dagger/Module2Module.java create mode 100644 module2/src/main/java/com/heyongrui/module2/gank/contract/GankContract.kt create mode 100644 module2/src/main/java/com/heyongrui/module2/gank/presenter/GankPresenter.kt create mode 100644 module2/src/main/java/com/heyongrui/module2/gank/view/GankActivity.kt create mode 100644 module2/src/main/res/layout/activity_gank.xml diff --git a/base/src/main/java/com/heyongrui/base/assist/ConfigConstants.java b/base/src/main/java/com/heyongrui/base/assist/ConfigConstants.java index 20c113f..cc2fde9 100644 --- a/base/src/main/java/com/heyongrui/base/assist/ConfigConstants.java +++ b/base/src/main/java/com/heyongrui/base/assist/ConfigConstants.java @@ -43,6 +43,7 @@ public class ConfigConstants { public static final String PATH_MODULE_PROVIDER = "/module/main/service"; //module2模块路由路径 public static final String PATH_MODULE2_PROVIDER = "/module2/main/service"; + public static final String PATH_GANK = "/module2/gank"; public static final String PATH_WELFARE = "/module2/welfare"; public static final String PATH_ABOUT = "/module2/about"; public static final String PATH_ENCOURAGE = "/module2/encourage"; diff --git a/module2/src/main/AndroidManifest.xml b/module2/src/main/AndroidManifest.xml index 17fcf66..23f4244 100644 --- a/module2/src/main/AndroidManifest.xml +++ b/module2/src/main/AndroidManifest.xml @@ -11,5 +11,8 @@ + diff --git a/module2/src/main/debug/AndroidManifest.xml b/module2/src/main/debug/AndroidManifest.xml index 8621400..b48cbb0 100644 --- a/module2/src/main/debug/AndroidManifest.xml +++ b/module2/src/main/debug/AndroidManifest.xml @@ -27,6 +27,9 @@ + diff --git a/module2/src/main/java/com/heyongrui/module2/Module2Fragment.java b/module2/src/main/java/com/heyongrui/module2/Module2Fragment.java index 579c814..6a51e69 100644 --- a/module2/src/main/java/com/heyongrui/module2/Module2Fragment.java +++ b/module2/src/main/java/com/heyongrui/module2/Module2Fragment.java @@ -125,6 +125,9 @@ private void initBalls() { case 1://福利 ARouter.getInstance().build(ConfigConstants.PATH_WELFARE).navigation(); break; + case 2://Android + ARouter.getInstance().build(ConfigConstants.PATH_GANK).withInt("type", 1).navigation(); + break; case 9://关于 ARouter.getInstance().build(ConfigConstants.PATH_ABOUT).navigation(); break; diff --git a/module2/src/main/java/com/heyongrui/module2/dagger/ActivityContext.java b/module2/src/main/java/com/heyongrui/module2/dagger/ActivityContext.java new file mode 100644 index 0000000..4a8d4d1 --- /dev/null +++ b/module2/src/main/java/com/heyongrui/module2/dagger/ActivityContext.java @@ -0,0 +1,12 @@ +package com.heyongrui.module2.dagger; + +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; + +import javax.inject.Qualifier; + +@Qualifier +@Retention(RetentionPolicy.RUNTIME) +public @interface ActivityContext { + +} \ No newline at end of file diff --git a/module2/src/main/java/com/heyongrui/module2/dagger/Module2Component.java b/module2/src/main/java/com/heyongrui/module2/dagger/Module2Component.java new file mode 100644 index 0000000..43d6a58 --- /dev/null +++ b/module2/src/main/java/com/heyongrui/module2/dagger/Module2Component.java @@ -0,0 +1,27 @@ +package com.heyongrui.module2.dagger; + +import android.app.Activity; + +import androidx.fragment.app.Fragment; + +import com.heyongrui.base.dagger.AppComponent; +import com.heyongrui.base.dagger.PerActivity; +import com.heyongrui.module2.gank.presenter.GankPresenter; + +import dagger.Component; + +/** + * 2019/8/26 + * lambert + * 此Component依赖AppComponent,由于AppComponent使用了@Singleton,此处只能使用自定义@Scope(@PerActivity) + */ + +@PerActivity +@Component(dependencies = AppComponent.class, modules = {Module2Module.class}) +public interface Module2Component { + Activity getActivity(); + + Fragment getFragment(); + + void inject(GankPresenter gankPresenter); +} diff --git a/module2/src/main/java/com/heyongrui/module2/dagger/Module2Module.java b/module2/src/main/java/com/heyongrui/module2/dagger/Module2Module.java new file mode 100644 index 0000000..5d1024d --- /dev/null +++ b/module2/src/main/java/com/heyongrui/module2/dagger/Module2Module.java @@ -0,0 +1,62 @@ +package com.heyongrui.module2.dagger; + + +import android.app.Activity; +import android.content.Context; + +import androidx.fragment.app.Fragment; + +import com.heyongrui.base.dagger.PerActivity; +import com.heyongrui.module2.data.service.GankService; + +import dagger.Module; +import dagger.Provides; + +@Module +public class Module2Module { + + private Activity mActivity; + private Fragment mFragment; + + public Module2Module() { + } + + public Module2Module(Activity activity) { + mActivity = activity; + } + + public Module2Module(Fragment fragment) { + this.mFragment = fragment; + } + + @Provides + Activity provideActivity() { + return mActivity; + } + + @Provides + Fragment provideFragment() { + return mFragment; + } + + /* + * @ActivityContext别名,通过在@Inject时加入这个自定义注解达到返回相同provider类型但是数据不同(eg:User() User(int age)) + */ + @Provides + @ActivityContext + Context providesContext() { + Context context = null; + if (null != mActivity) { + context = mActivity; + } else if (null != mFragment) { + context = mFragment.getContext(); + } + return context; + } + + @Provides + @PerActivity + GankService provideGankService() { + return new GankService(); + } +} diff --git a/module2/src/main/java/com/heyongrui/module2/data/api/GankApi.java b/module2/src/main/java/com/heyongrui/module2/data/api/GankApi.java index bab7369..2356235 100644 --- a/module2/src/main/java/com/heyongrui/module2/data/api/GankApi.java +++ b/module2/src/main/java/com/heyongrui/module2/data/api/GankApi.java @@ -12,6 +12,6 @@ public interface GankApi { - @GET("data/福利/{per_page}/{page}") - Observable getWelfare(@Path("per_page") int per_page, @Path("page") int page); + @GET("data/{category}/{per_page}/{page}") + Observable getGankCategory(@Path("category") String category, @Path("per_page") int per_page, @Path("page") int page); } diff --git a/module2/src/main/java/com/heyongrui/module2/data/service/GankService.java b/module2/src/main/java/com/heyongrui/module2/data/service/GankService.java index e68ec33..6c46e49 100644 --- a/module2/src/main/java/com/heyongrui/module2/data/service/GankService.java +++ b/module2/src/main/java/com/heyongrui/module2/data/service/GankService.java @@ -21,7 +21,13 @@ public GankService() { public Observable getWelfare(int perPage, int page) { return ApiService.createApi(GankApi.class, BASE_URL_GANK) - .getWelfare(perPage, page) + .getGankCategory("福利", perPage, page) + .compose(RxHelper.rxSchedulerHelper()); + } + + public Observable getAndroid(int perPage, int page) { + return ApiService.createApi(GankApi.class, BASE_URL_GANK) + .getGankCategory("Android", perPage, page) .compose(RxHelper.rxSchedulerHelper()); } } diff --git a/module2/src/main/java/com/heyongrui/module2/gank/contract/GankContract.kt b/module2/src/main/java/com/heyongrui/module2/gank/contract/GankContract.kt new file mode 100644 index 0000000..7624976 --- /dev/null +++ b/module2/src/main/java/com/heyongrui/module2/gank/contract/GankContract.kt @@ -0,0 +1,27 @@ +package com.heyongrui.module2.gank.contract + +import androidx.recyclerview.widget.RecyclerView +import com.chad.library.adapter.base.BaseQuickAdapter +import com.heyongrui.base.base.BasePresenter +import com.heyongrui.base.base.BaseView +import com.heyongrui.module2.adapter.Module2SectionAdapter +import com.heyongrui.module2.data.dto.WelfareDto +import com.scwang.smartrefresh.header.StoreHouseHeader +import com.scwang.smartrefresh.layout.SmartRefreshLayout +import com.scwang.smartrefresh.layout.listener.OnRefreshLoadMoreListener + +interface GankContract { + interface View : BaseView { + fun getAndroidSuccess(welfareDto: WelfareDto) + + fun getAndroidFail(errorCode: Int, errorMsg: String) + } + + abstract class Presenter : BasePresenter() { + abstract fun initSwipeRefresh(smartRefreshLayout: SmartRefreshLayout, storeHouseHeader: StoreHouseHeader, onRefreshLoadMoreListener: OnRefreshLoadMoreListener) + + abstract fun initRecyclerView(recyclerView: RecyclerView, listener: BaseQuickAdapter.OnItemClickListener): Module2SectionAdapter + + abstract fun getAndroid(perPage: Int, page: Int) + } +} \ No newline at end of file diff --git a/module2/src/main/java/com/heyongrui/module2/gank/presenter/GankPresenter.kt b/module2/src/main/java/com/heyongrui/module2/gank/presenter/GankPresenter.kt new file mode 100644 index 0000000..8dfbbf8 --- /dev/null +++ b/module2/src/main/java/com/heyongrui/module2/gank/presenter/GankPresenter.kt @@ -0,0 +1,74 @@ +package com.heyongrui.module2.gank.presenter + +import androidx.core.content.ContextCompat +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +import com.blankj.utilcode.util.ConvertUtils +import com.chad.library.adapter.base.BaseQuickAdapter +import com.heyongrui.base.app.BaseApplication +import com.heyongrui.base.widget.itemdecoration.RecycleViewItemDecoration +import com.heyongrui.module2.R +import com.heyongrui.module2.adapter.Module2SectionAdapter +import com.heyongrui.module2.adapter.Module2SectionEntity +import com.heyongrui.module2.dagger.DaggerModule2Component +import com.heyongrui.module2.dagger.Module2Module +import com.heyongrui.module2.data.dto.WelfareDto +import com.heyongrui.module2.data.service.GankService +import com.heyongrui.module2.gank.contract.GankContract +import com.heyongrui.network.configure.ResponseDisposable +import com.scwang.smartrefresh.header.StoreHouseHeader +import com.scwang.smartrefresh.layout.SmartRefreshLayout +import com.scwang.smartrefresh.layout.listener.OnRefreshLoadMoreListener +import java.util.* +import javax.inject.Inject + +class GankPresenter : GankContract.Presenter() { + + @Inject + lateinit var mGankService: GankService + + init { + DaggerModule2Component.builder().appComponent(BaseApplication.getAppComponent()).module2Module(Module2Module()).build().inject(this) + } + + override fun initSwipeRefresh(smartRefreshLayout: SmartRefreshLayout, storeHouseHeader: StoreHouseHeader, onRefreshLoadMoreListener: OnRefreshLoadMoreListener) { + storeHouseHeader.setTextColor(ContextCompat.getColor(mContext, R.color.white)) + smartRefreshLayout.setPrimaryColors(ContextCompat.getColor(mContext, R.color.colorPrimaryDark)) + smartRefreshLayout.setDisableContentWhenRefresh(true)//是否在刷新的时候禁止列表的操作 + smartRefreshLayout.setDisableContentWhenLoading(true)//是否在加载的时候禁止列表的操作 + smartRefreshLayout.setEnableNestedScroll(true) + smartRefreshLayout.setEnableLoadMoreWhenContentNotFull(true) + smartRefreshLayout.setOnRefreshLoadMoreListener(onRefreshLoadMoreListener) + } + + override fun initRecyclerView(recyclerView: RecyclerView, listener: BaseQuickAdapter.OnItemClickListener): Module2SectionAdapter { + val data = ArrayList() + val moduleSectionAdapter = Module2SectionAdapter(data) + recyclerView.layoutManager = LinearLayoutManager(mContext) + moduleSectionAdapter.bindToRecyclerView(recyclerView) + val dp10 = ConvertUtils.dp2px(10f) + recyclerView.addItemDecoration(RecycleViewItemDecoration(mContext, dp10)) + moduleSectionAdapter.setSpanSizeLookup({ gridLayoutManager, position -> data[position].getSpanSize() }) + if (null != listener) { + moduleSectionAdapter.setOnItemClickListener(listener) + } + return moduleSectionAdapter + } + + override fun getAndroid(perPage: Int, page: Int) { + mRxManager.add(mGankService.getAndroid(perPage, page).subscribeWith( + object : ResponseDisposable(mContext, true) { + override fun onSuccess(welfareDto: WelfareDto) { + if (mView != null) { + mView.getAndroidSuccess(welfareDto) + } + } + + override fun onFailure(errorCode: Int, errorMsg: String) { + if (mView != null) { + mView.getAndroidFail(errorCode, errorMsg) + } + } + })) + } +} \ No newline at end of file diff --git a/module2/src/main/java/com/heyongrui/module2/gank/view/GankActivity.kt b/module2/src/main/java/com/heyongrui/module2/gank/view/GankActivity.kt new file mode 100644 index 0000000..1c9d827 --- /dev/null +++ b/module2/src/main/java/com/heyongrui/module2/gank/view/GankActivity.kt @@ -0,0 +1,119 @@ +package com.heyongrui.module2.gank.view + +import android.os.Bundle +import android.view.View +import androidx.core.content.ContextCompat +import com.alibaba.android.arouter.facade.annotation.Autowired +import com.alibaba.android.arouter.facade.annotation.Route +import com.blankj.utilcode.util.ToastUtils +import com.chad.library.adapter.base.BaseQuickAdapter +import com.heyongrui.base.assist.ConfigConstants +import com.heyongrui.base.base.BaseActivity +import com.heyongrui.base.utils.DrawableUtil +import com.heyongrui.module2.R +import com.heyongrui.module2.adapter.Module2SectionAdapter +import com.heyongrui.module2.adapter.Module2SectionEntity +import com.heyongrui.module2.data.dto.WelfareDto +import com.heyongrui.module2.gank.contract.GankContract +import com.heyongrui.module2.gank.presenter.GankPresenter +import com.scwang.smartrefresh.layout.api.RefreshLayout +import com.scwang.smartrefresh.layout.listener.OnRefreshLoadMoreListener +import kotlinx.android.synthetic.main.activity_gank.* +import java.util.* + +@Route(path = ConfigConstants.PATH_GANK) +class GankActivity : BaseActivity(), GankContract.View, View.OnClickListener, BaseQuickAdapter.OnItemClickListener, OnRefreshLoadMoreListener { + + @JvmField + @Autowired(name = "type") + var mType: Int = 0 + + private val mPerPage = 10 + private var mPage = 1 + private var mIsLastPage: Boolean = false + lateinit var mGankAdapter: Module2SectionAdapter + + override fun initImmersionBar() { + super.initImmersionBar() +// ImmersionBar.with(this).fullScreen(true).hideBar(BarHide.FLAG_HIDE_BAR).init() + } + + override fun setPresenter(): GankContract.Presenter { + return GankPresenter() + } + + override fun onClick(p0: View?) { + if (p0 != null) { + if (p0 == iv_back) { + finish() + } + } + } + + override fun getLayoutId(): Int { + return R.layout.activity_gank; + } + + override fun init(savedInstanceState: Bundle?) { + addOnClickListeners(this@GankActivity, iv_back) + + val tintDrawable = DrawableUtil.tintDrawable(this@GankActivity, R.drawable.ic_back, ContextCompat.getColor(this@GankActivity, R.color.background)) + iv_back.setImageDrawable(tintDrawable) + + mPresenter.initSwipeRefresh(refresh_layout, store_house_header, this@GankActivity) + mGankAdapter = mPresenter.initRecyclerView(rlv_gank, this@GankActivity) + + refresh_layout.autoRefresh() + } + + private fun loadData() { + mPresenter.getAndroid(mPerPage, mPage) + } + + override fun onLoadMore(refreshLayout: RefreshLayout) { + } + + override fun onRefresh(refreshLayout: RefreshLayout) { + loadData() + } + + override fun onItemClick(adapter: BaseQuickAdapter<*, *>?, view: View?, position: Int) { + + } + + override fun getAndroidSuccess(welfareDto: WelfareDto) { + resetRefreshLayout(true, true, false) + val addDataList = ArrayList() + if (welfareDto != null) { + if (!welfareDto.isError) { + val welfareBeanList = welfareDto.results + if (welfareBeanList != null && !welfareBeanList.isEmpty()) { + if (welfareBeanList.size < mPerPage) { + mIsLastPage = true + } + for (welfareBean in welfareBeanList) { + addDataList.add(Module2SectionEntity(Module2SectionEntity.WELFARE, welfareBean)) + } + } else { + mIsLastPage = true + } + } + } + mGankAdapter.replaceData(addDataList) + } + + override fun getAndroidFail(errorCode: Int, errorMsg: String) { + ToastUtils.showShort(errorMsg) + resetRefreshLayout(true, true, false) + } + + private fun resetRefreshLayout(isFinishLoadMore: Boolean, isFinishRefresh: Boolean, noMoreData: Boolean) { + if (isFinishLoadMore) { + refresh_layout.finishLoadMore() + } + if (isFinishRefresh) { + refresh_layout.finishRefresh() + } + refresh_layout.setNoMoreData(noMoreData) + } +} \ No newline at end of file diff --git a/module2/src/main/res/layout/activity_gank.xml b/module2/src/main/res/layout/activity_gank.xml new file mode 100644 index 0000000..13f0e1a --- /dev/null +++ b/module2/src/main/res/layout/activity_gank.xml @@ -0,0 +1,78 @@ + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file