整理代码

This commit is contained in:
kehaoyuan
2019-06-09 14:31:51 +08:00
parent 1b27f481ba
commit ab0d341bca
3 changed files with 67 additions and 40 deletions

View File

@ -5,59 +5,86 @@ import android.content.Context
import android.content.Intent
import android.os.Parcelable
import com.gh.common.annotation.Synchronize
import com.gh.common.util.SyncDataBetweenPageHelper.resultHandle
import com.gh.gamecenter.entity.RatingComment
import com.gh.gamecenter.gamedetail.rating.RatingAdapter
import com.gh.gamecenter.gamedetail.rating.RatingReplyActivity
/**
* 页面之间实现数据同步
* 需要同步的数据,在相应的字段加上[Synchronize]注解,关键方法[resultHandle]
* 如无特殊情况,尽量使用下面方法进行页面联动
* ----------------------------------------------------------------
* 具体参考(游戏详情:评论列表<-->评论详情):
* 数据实体=>[RatingComment]
* 回调数据=>[RatingReplyActivity.handleBackPressed]
* 回调处理=>[RatingAdapter.handleSyncData]
*/
const val REQUEST_CODE_TAG = "REQUEST_CODE_TAG"
const val DATA_POSITION_TAG = "DATA_POSITION_TAG"
const val DEFAULT_NUMBER = -1111
fun Context.startActivityForResult(intent: Intent, requestCode: Int, dataPosition: Int) {
if (this is Activity) {
intent.putExtra(DATA_POSITION_TAG, dataPosition)
intent.putExtra(REQUEST_CODE_TAG, requestCode)
startActivityForResult(intent, requestCode)
}
}
object SyncDataBetweenPageHelper {
fun <T : Parcelable> Context.setResultAndFinish(syncData: T?, resultCode: Int = Activity.RESULT_OK): Boolean {
if (this is Activity) {
val requestCode = intent.getIntExtra(REQUEST_CODE_TAG, DEFAULT_NUMBER)
val dataPosition = intent.getIntExtra(DATA_POSITION_TAG, DEFAULT_NUMBER)
if (syncData != null && requestCode != DEFAULT_NUMBER) {
val intent = Intent()
private const val REQUEST_CODE_TAG = "REQUEST_CODE_TAG"
private const val DATA_POSITION_TAG = "DATA_POSITION_TAG"
private const val DEFAULT_NUMBER = -1111
fun startActivityForResult(context: Context, intent: Intent, requestCode: Int, dataPosition: Int) {
if (context is Activity) {
intent.putExtra(DATA_POSITION_TAG, dataPosition)
intent.putExtra(syncData::class.java.simpleName, syncData)
setResult(resultCode, intent)
finish()
return true
intent.putExtra(REQUEST_CODE_TAG, requestCode)
context.startActivityForResult(intent, requestCode)
}
}
return false
}
fun <T : Parcelable> Intent.resultHandle(callback: OnSyncCallBack<T>) {
val dataPosition = getIntExtra(DATA_POSITION_TAG, DEFAULT_NUMBER)
val syncData = callback.onData(dataPosition) ?: return
val resultData = getParcelableExtra<T>(syncData::class.java.simpleName)
val fields = syncData::class.java.declaredFields
for (field in fields) {
if (field.getAnnotation(Synchronize::class.java) != null) {
// 同步数据
val resultField = resultData::class.java.getDeclaredField(field.name)
resultField.isAccessible = true
field.isAccessible = true
field.set(syncData, resultField.get(resultData))
fun <T : Parcelable> setResultAndFinish(context: Context, syncData: T?, resultCode: Int = Activity.RESULT_OK): Boolean {
if (context is Activity) {
val requestCode = context.intent.getIntExtra(REQUEST_CODE_TAG, DEFAULT_NUMBER)
val dataPosition = context.intent.getIntExtra(DATA_POSITION_TAG, DEFAULT_NUMBER)
if (syncData != null && requestCode != DEFAULT_NUMBER) {
val intent = Intent()
intent.putExtra(DATA_POSITION_TAG, dataPosition)
intent.putExtra(syncData::class.java.simpleName, syncData)
context.setResult(resultCode, intent)
context.finish()
return true
}
}
return false
}
fun <T : Parcelable> resultHandle(intent: Intent?, callback: OnSyncCallBack<T>) {
if (intent == null) return
val dataPosition = intent.getIntExtra(DATA_POSITION_TAG, DEFAULT_NUMBER)
val syncData = callback.onData(dataPosition) ?: return
val resultData = intent.getParcelableExtra<T>(syncData::class.java.simpleName)
val fields = syncData::class.java.declaredFields
var isNeedNotify = false
for (field in fields) {
if (field.getAnnotation(Synchronize::class.java) != null) {
// 同步数据
val resultField = resultData::class.java.getDeclaredField(field.name)
resultField.isAccessible = true
field.isAccessible = true
val resultFieldDate = resultField.get(resultData)
if (field.get(syncData) != resultFieldDate) {
field.set(syncData, resultFieldDate)
if (!isNeedNotify) isNeedNotify = true
}
}
}
if (isNeedNotify) callback.onNotify(dataPosition)
}
callback.onNotify(dataPosition)
}
/**
* dataPosition: 数据位置,和[SyncDataBetweenPageHelper.startActivityForResult] 的dataPosition对应
* [onData]: 返回需要同步的原数据
* [onNotify]: 同步完成后刷新页面,如果数据没有更改的话就不会触发(如果标记的不是基本数据类型有可能会触发)
*/
interface OnSyncCallBack<T> {
fun onData(dataPosition: Int): T?

View File

@ -170,7 +170,7 @@ class RatingAdapter(context: Context,
} else {
RatingReplyActivity.getIntent(mContext, mListViewModel.game, commentData, mEntrance, path)
}
mContext.startActivityForResult(intent, RatingFragment.RATING_REPLAY_REQUEST, dataPosition)
SyncDataBetweenPageHelper.startActivityForResult(mContext, intent, RatingFragment.RATING_REPLAY_REQUEST, dataPosition)
}
private fun skipRatingEdit(starCount: Float, entrance: String) {
@ -188,7 +188,7 @@ class RatingAdapter(context: Context,
}
fun handleSyncData(intent: Intent?) {
intent?.resultHandle(object : OnSyncCallBack<RatingComment> {
SyncDataBetweenPageHelper.resultHandle(intent, object : OnSyncCallBack<RatingComment> {
override fun onData(dataPosition: Int): RatingComment? {
if (dataPosition == headDataPosition) return ratingData?.serviceComment
return mEntityList[dataPosition]

View File

@ -17,8 +17,8 @@ import butterknife.OnClick
import com.gh.base.fragment.WaitingDialogFragment
import com.gh.common.util.CheckLoginUtils
import com.gh.common.util.EntranceUtils
import com.gh.common.util.SyncDataBetweenPageHelper
import com.gh.common.util.TextHelper
import com.gh.common.util.setResultAndFinish
import com.gh.common.view.VerticalItemDecoration
import com.gh.download.DownloadManager
import com.gh.gamecenter.R
@ -203,7 +203,7 @@ class RatingReplyActivity : ListActivity<RatingReplyEntity, RatingReplyViewModel
}
override fun handleBackPressed(): Boolean {
if (setResultAndFinish(mListViewModel.comment)) {
if (SyncDataBetweenPageHelper.setResultAndFinish(this, mListViewModel.comment)) {
return true
}
return super.handleBackPressed()