diff --git a/app/src/main/java/com/gh/common/util/SyncDataBetweenPageHelper.kt b/app/src/main/java/com/gh/common/util/SyncDataBetweenPageHelper.kt index 75c3a2e1c6..954a178f36 100644 --- a/app/src/main/java/com/gh/common/util/SyncDataBetweenPageHelper.kt +++ b/app/src/main/java/com/gh/common/util/SyncDataBetweenPageHelper.kt @@ -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 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 Intent.resultHandle(callback: OnSyncCallBack) { - val dataPosition = getIntExtra(DATA_POSITION_TAG, DEFAULT_NUMBER) - val syncData = callback.onData(dataPosition) ?: return - - val resultData = getParcelableExtra(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 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 resultHandle(intent: Intent?, callback: OnSyncCallBack) { + if (intent == null) return + + val dataPosition = intent.getIntExtra(DATA_POSITION_TAG, DEFAULT_NUMBER) + val syncData = callback.onData(dataPosition) ?: return + + val resultData = intent.getParcelableExtra(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 { fun onData(dataPosition: Int): T? diff --git a/app/src/main/java/com/gh/gamecenter/gamedetail/rating/RatingAdapter.kt b/app/src/main/java/com/gh/gamecenter/gamedetail/rating/RatingAdapter.kt index b968b94264..82f05658f7 100644 --- a/app/src/main/java/com/gh/gamecenter/gamedetail/rating/RatingAdapter.kt +++ b/app/src/main/java/com/gh/gamecenter/gamedetail/rating/RatingAdapter.kt @@ -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 { + SyncDataBetweenPageHelper.resultHandle(intent, object : OnSyncCallBack { override fun onData(dataPosition: Int): RatingComment? { if (dataPosition == headDataPosition) return ratingData?.serviceComment return mEntityList[dataPosition] diff --git a/app/src/main/java/com/gh/gamecenter/gamedetail/rating/RatingReplyActivity.kt b/app/src/main/java/com/gh/gamecenter/gamedetail/rating/RatingReplyActivity.kt index 331f7287a6..9cbe9903ed 100644 --- a/app/src/main/java/com/gh/gamecenter/gamedetail/rating/RatingReplyActivity.kt +++ b/app/src/main/java/com/gh/gamecenter/gamedetail/rating/RatingReplyActivity.kt @@ -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