Skip to content

Commit

Permalink
kotlin编写Gank页面
Browse files Browse the repository at this point in the history
  • Loading branch information
wosojadfjgo committed Aug 30, 2019
1 parent c39f76d commit 420aabb
Show file tree
Hide file tree
Showing 13 changed files with 418 additions and 3 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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";
Expand Down
3 changes: 3 additions & 0 deletions module2/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -11,5 +11,8 @@
<activity
android:name=".about.view.EncourageActivity"
android:theme="@style/BaseAppTheme" />
<activity
android:name=".gank.view.GankActivity"
android:theme="@style/BaseAppTheme" />
</application>
</manifest>
3 changes: 3 additions & 0 deletions module2/src/main/debug/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,9 @@
<activity
android:name=".about.view.EncourageActivity"
android:theme="@style/BaseAppTheme" />
<activity
android:name=".gank.view.GankActivity"
android:theme="@style/BaseAppTheme" />
</application>

</manifest>
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
Original file line number Diff line number Diff line change
@@ -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 {

}
Original file line number Diff line number Diff line change
@@ -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);
}
Original file line number Diff line number Diff line change
@@ -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();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,6 @@

public interface GankApi {

@GET("data/福利/{per_page}/{page}")
Observable<WelfareDto> getWelfare(@Path("per_page") int per_page, @Path("page") int page);
@GET("data/{category}/{per_page}/{page}")
Observable<WelfareDto> getGankCategory(@Path("category") String category, @Path("per_page") int per_page, @Path("page") int page);
}
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,13 @@ public GankService() {

public Observable<WelfareDto> getWelfare(int perPage, int page) {
return ApiService.createApi(GankApi.class, BASE_URL_GANK)
.getWelfare(perPage, page)
.getGankCategory("福利", perPage, page)
.compose(RxHelper.rxSchedulerHelper());
}

public Observable<WelfareDto> getAndroid(int perPage, int page) {
return ApiService.createApi(GankApi.class, BASE_URL_GANK)
.getGankCategory("Android", perPage, page)
.compose(RxHelper.rxSchedulerHelper());
}
}
Original file line number Diff line number Diff line change
@@ -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<Any> {
fun getAndroidSuccess(welfareDto: WelfareDto)

fun getAndroidFail(errorCode: Int, errorMsg: String)
}

abstract class Presenter : BasePresenter<View>() {
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)
}
}
Original file line number Diff line number Diff line change
@@ -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<Module2SectionEntity>()
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<WelfareDto>(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)
}
}
}))
}
}
119 changes: 119 additions & 0 deletions module2/src/main/java/com/heyongrui/module2/gank/view/GankActivity.kt
Original file line number Diff line number Diff line change
@@ -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.Presenter>(), 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<Module2SectionEntity>()
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)
}
}
Loading

0 comments on commit 420aabb

Please sign in to comment.