diff --git a/app/src/main/java/com/huanchengfly/tieba/post/activities/ThreadActivity.kt b/app/src/main/java/com/huanchengfly/tieba/post/activities/ThreadActivity.kt index 3b62f183..e7b1cc2e 100644 --- a/app/src/main/java/com/huanchengfly/tieba/post/activities/ThreadActivity.kt +++ b/app/src/main/java/com/huanchengfly/tieba/post/activities/ThreadActivity.kt @@ -57,6 +57,7 @@ import retrofit2.Call import retrofit2.Callback import retrofit2.Response +//TODO: 重写,去除两次加载 @SuppressLint("NonConstantResourceId") class ThreadActivity : BaseActivity(), View.OnClickListener, IThreadMenuFragment.OnActionsListener { @BindView(R.id.toolbar) @@ -206,10 +207,10 @@ class ThreadActivity : BaseActivity(), View.OnClickListener, IThreadMenuFragment } if (newState == RecyclerView.SCROLL_STATE_IDLE) { Glide.with(this@ThreadActivity) - .resumeRequests() + .resumeRequests() } else { Glide.with(this@ThreadActivity) - .pauseRequests() + .pauseRequests() } } }) @@ -231,7 +232,7 @@ class ThreadActivity : BaseActivity(), View.OnClickListener, IThreadMenuFragment } val videoPlayerStandard: VideoPlayerStandard? = view.findViewById(R.id.video_player) if (videoPlayerStandard != null && Jzvd.CURRENT_JZVD != null && - videoPlayerStandard.jzDataSource.containsTheUrl(Jzvd.CURRENT_JZVD.jzDataSource.currentUrl)) { + videoPlayerStandard.jzDataSource.containsTheUrl(Jzvd.CURRENT_JZVD.jzDataSource.currentUrl)) { if (Jzvd.CURRENT_JZVD != null && Jzvd.CURRENT_JZVD.screen != Jzvd.SCREEN_FULLSCREEN) { Jzvd.releaseAllVideos() } @@ -361,8 +362,8 @@ class ThreadActivity : BaseActivity(), View.OnClickListener, IThreadMenuFragment threadMainPostAdapter.dataBean = dataBean delegateAdapter.addAdapter(threadMainPostAdapter) if (!dataBean?.postList?.filter { - it.floor != "1" - }.isNullOrEmpty()) { + it.floor != "1" + }.isNullOrEmpty()) { threadHeaderAdapter.title = getString(R.string.title_thread_header, dataBean?.thread?.replyNum) threadHeaderAdapter.seeLz = seeLz delegateAdapter.addAdapter(threadHeaderAdapter) @@ -431,21 +432,21 @@ class ThreadActivity : BaseActivity(), View.OnClickListener, IThreadMenuFragment tip = true if (pid != maxPostId) { Util.createSnackbar(recyclerView, getString(R.string.tip_collect, postListItemBean.floor), Snackbar.LENGTH_LONG) - .setAction(R.string.button_load_new) { refreshByPid(maxPostId!!) } - .show() + .setAction(R.string.button_load_new) { refreshByPid(maxPostId!!) } + .show() } } FROM_HISTORY == from && "1" != postListItemBean.floor -> { tip = true Util.createSnackbar(recyclerView, getString(R.string.tip_from_history, postListItemBean.floor), Snackbar.LENGTH_LONG) - .setAction(R.string.button_load_top) { - if (page <= 1) { - recyclerView.scrollToPosition(0) - } else { - refreshLayout.autoRefresh() - } + .setAction(R.string.button_load_top) { + if (page <= 1) { + recyclerView.scrollToPosition(0) + } else { + refreshLayout.autoRefresh() } - .show() + } + .show() } } } @@ -615,19 +616,27 @@ class ThreadActivity : BaseActivity(), View.OnClickListener, IThreadMenuFragment private fun updateHistory(async: Boolean = false) { if (dataBean != null && dataBean!!.thread != null) { - val postListItemBean = lastVisibleItem + val postListItemBean = try { + lastVisibleItem + } catch (t: Throwable) { + try { + firstVisibleItem + } catch (t: Throwable) { + null + } + } var extras = "" if (postListItemBean != null) { extras = ThreadHistoryInfoBean() - .setPid(postListItemBean.id) - .setSeeLz(seeLz) - .toString() + .setPid(postListItemBean.id) + .setSeeLz(seeLz) + .toString() } val history = History() - .setData(threadId) - .setExtras(extras) - .setTitle(dataBean!!.thread?.title) - .setType(HistoryUtil.TYPE_THREAD) + .setData(threadId) + .setExtras(extras) + .setTitle(dataBean!!.thread?.title) + .setType(HistoryUtil.TYPE_THREAD) if (dataBean!!.thread?.author != null) { history.avatar = dataBean!!.thread?.author?.portrait history.username = dataBean!!.thread?.author?.nameShow @@ -644,27 +653,27 @@ class ThreadActivity : BaseActivity(), View.OnClickListener, IThreadMenuFragment private fun exit(): Boolean { if (collect) { DialogUtil.build(this) - .setMessage(R.string.message_update_store_floor) - .setPositiveButton(R.string.button_yes) { dialog: DialogInterface, _ -> - collect(object : CommonAPICallback { - override fun onSuccess(data: CommonResponse) { - Toast.makeText(this@ThreadActivity, R.string.toast_collect_update_success, Toast.LENGTH_SHORT).show() - dialog.cancel() - finish() - } + .setMessage(R.string.message_update_store_floor) + .setPositiveButton(R.string.button_yes) { dialog: DialogInterface, _ -> + collect(object : CommonAPICallback { + override fun onSuccess(data: CommonResponse) { + Toast.makeText(this@ThreadActivity, R.string.toast_collect_update_success, Toast.LENGTH_SHORT).show() + dialog.cancel() + finish() + } - override fun onFailure(code: Int, error: String) { - Toast.makeText(this@ThreadActivity, getString(R.string.toast_collect_update_error, error), Toast.LENGTH_SHORT).show() - } - }, true) - } - .setNegativeButton(R.string.button_no) { dialog: DialogInterface, _ -> - dialog.cancel() - finish() - } - .setNeutralButton(R.string.button_cancel, null) - .create() - .show() + override fun onFailure(code: Int, error: String) { + Toast.makeText(this@ThreadActivity, getString(R.string.toast_collect_update_error, error), Toast.LENGTH_SHORT).show() + } + }, true) + } + .setNegativeButton(R.string.button_no) { dialog: DialogInterface, _ -> + dialog.cancel() + finish() + } + .setNeutralButton(R.string.button_cancel, null) + .create() + .show() return false } return true @@ -683,20 +692,20 @@ class ThreadActivity : BaseActivity(), View.OnClickListener, IThreadMenuFragment when (v.id) { R.id.thread_reply_bar -> if (dataBean != null && dataBean!!.thread != null) { startActivity(Intent(this@ThreadActivity, ReplyActivity::class.java) - .putExtra("data", ReplyInfoBean(dataBean!!.thread?.id, - dataBean!!.forum?.id, - dataBean!!.forum?.name, - dataBean!!.anti?.tbs, - dataBean!!.user?.nameShow).setPn(dataBean!!.page?.offset).toString())) + .putExtra("data", ReplyInfoBean(dataBean!!.thread?.id, + dataBean!!.forum?.id, + dataBean!!.forum?.name, + dataBean!!.anti?.tbs, + dataBean!!.user?.nameShow).setPn(dataBean!!.page?.offset).toString())) } R.id.toolbar -> recyclerView.scrollToPosition(0) R.id.thread_bottom_bar_more_btn -> { MIUIThreadMenuFragment( - seeLz, - collect, - replyAdapter.isPureRead, - sort, - canDelete() + seeLz, + collect, + replyAdapter.isPureRead, + sort, + canDelete() ).apply { setOnActionsListener(this@ThreadActivity) show(supportFragmentManager, "Menu") @@ -822,12 +831,12 @@ class ThreadActivity : BaseActivity(), View.OnClickListener, IThreadMenuFragment @JvmOverloads @JvmStatic fun launch( - context: Context, - threadId: String, - postId: String? = null, - seeLz: Boolean? = null, - from: String? = null, - maxPid: String? = null + context: Context, + threadId: String, + postId: String? = null, + seeLz: Boolean? = null, + from: String? = null, + maxPid: String? = null ) { context.goToActivity { putExtra(EXTRA_THREAD_ID, threadId) @@ -926,17 +935,17 @@ class ThreadActivity : BaseActivity(), View.OnClickListener, IThreadMenuFragment override fun onJumpPage() { val dialog = EditTextDialog(this) - .setInputType(InputType.TYPE_CLASS_NUMBER or InputType.TYPE_NUMBER_VARIATION_NORMAL) - .setHelperText(String.format(getString(R.string.tip_jump_page), page, totalPage)) - .setOnSubmitListener { page: String? -> - val pn = Integer.valueOf(page!!) - if (pn in 1..totalPage) { - this.page = pn - refresh(false) - } else { - Toast.makeText(this@ThreadActivity, R.string.toast_jump_page_too_big, Toast.LENGTH_SHORT).show() - } + .setInputType(InputType.TYPE_CLASS_NUMBER or InputType.TYPE_NUMBER_VARIATION_NORMAL) + .setHelperText(String.format(getString(R.string.tip_jump_page), page, totalPage)) + .setOnSubmitListener { page: String? -> + val pn = Integer.valueOf(page!!) + if (pn in 1..totalPage) { + this.page = pn + refresh(false) + } else { + Toast.makeText(this@ThreadActivity, R.string.toast_jump_page_too_big, Toast.LENGTH_SHORT).show() } + } dialog.setTitle(R.string.title_jump_page) dialog.show() } diff --git a/app/src/main/java/com/huanchengfly/tieba/post/fragments/ForumFragment.kt b/app/src/main/java/com/huanchengfly/tieba/post/fragments/ForumFragment.kt index 0229b36e..77ebb391 100644 --- a/app/src/main/java/com/huanchengfly/tieba/post/fragments/ForumFragment.kt +++ b/app/src/main/java/com/huanchengfly/tieba/post/fragments/ForumFragment.kt @@ -46,7 +46,7 @@ class ForumFragment : BaseFragment(), Refreshable, OnSwitchListener, ScrollTopab lateinit var mRecyclerView: RecyclerView @BindView(R.id.refresh) - lateinit var mRefreshLayout: SmartRefreshLayout + var mRefreshLayout: SmartRefreshLayout? = null private val virtualLayoutManager: VirtualLayoutManager by lazy { VirtualLayoutManager( @@ -62,13 +62,13 @@ class ForumFragment : BaseFragment(), Refreshable, OnSwitchListener, ScrollTopab if (preload) { PreLoader.listenData(preloadId, DataHolder()) } else if (mDataBean == null) { - mRefreshLayout.autoRefresh() + mRefreshLayout?.autoRefresh() } } override fun onFragmentVisibleChange(isVisible: Boolean) { if (isVisible && mDataBean == null) { - mRefreshLayout.autoRefresh() + mRefreshLayout?.autoRefresh() } } @@ -147,8 +147,8 @@ class ForumFragment : BaseFragment(), Refreshable, OnSwitchListener, ScrollTopab override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) - mRefreshLayout.setOnRefreshListener { refresh() } - mRefreshLayout.setOnLoadMoreListener { loadMore() } + mRefreshLayout?.setOnRefreshListener { refresh() } + mRefreshLayout?.setOnLoadMoreListener { loadMore() } mRecyclerView.apply { layoutManager = virtualLayoutManager adapter = delegateAdapter @@ -179,14 +179,14 @@ class ForumFragment : BaseFragment(), Refreshable, OnSwitchListener, ScrollTopab .forumPageAsync(forumName!!, page + 1, sortType, classifyId) .doIfSuccess { page += 1 - mRefreshLayout.finishLoadMore() + mRefreshLayout?.finishLoadMore() mDataBean = it pageSize = it.page?.pageSize?.toInt() ?: 0 forumAdapter.addData(it) - mRefreshLayout.setNoMoreData(it.page?.hasMore == "0") + mRefreshLayout?.setNoMoreData(it.page?.hasMore == "0") } .doIfFailure { - mRefreshLayout.finishLoadMore(false) + mRefreshLayout?.finishLoadMore(false) } } } @@ -208,10 +208,10 @@ class ForumFragment : BaseFragment(), Refreshable, OnSwitchListener, ScrollTopab (attachContext as OnRefreshedListener).onFailure(errorCode, t.message) } } - mRefreshLayout.finishRefresh(false) + mRefreshLayout?.finishRefresh(false) if (errorCode == -1) { Util.showNetworkErrorSnackbar(mRecyclerView) { - mRefreshLayout.autoRefresh() + mRefreshLayout?.autoRefresh() } return } @@ -232,24 +232,24 @@ class ForumFragment : BaseFragment(), Refreshable, OnSwitchListener, ScrollTopab (attachContext as OnRefreshedListener).onSuccess(forumPageBean) } } - mRefreshLayout.finishRefresh() + mRefreshLayout?.finishRefresh() mDataBean = forumPageBean pageSize = forumPageBean.page?.pageSize?.toInt()!! forumAdapter.setData(forumPageBean) - mRefreshLayout.setNoMoreData(mDataBean!!.page?.hasMore == "0") + mRefreshLayout?.setNoMoreData(mDataBean!!.page?.hasMore == "0") reloadAdapters() } }) } override fun onRefresh() { - mRefreshLayout.autoRefresh() + mRefreshLayout?.autoRefresh() } override fun onSwitch(which: Int) { if (isGood && mDataBean != null) { classifyId = mDataBean!!.forum?.goodClassify?.get(which)?.classId!! - mRefreshLayout.autoRefresh() + mRefreshLayout?.autoRefresh() } } @@ -265,7 +265,7 @@ class ForumFragment : BaseFragment(), Refreshable, OnSwitchListener, ScrollTopab internal inner class DataHolder : DataListener { override fun onDataArrived(forumPageBean: ForumPageBean?) { if (forumPageBean == null) { - mRefreshLayout.autoRefresh() + mRefreshLayout?.autoRefresh() return } if (!isGood) { @@ -273,11 +273,11 @@ class ForumFragment : BaseFragment(), Refreshable, OnSwitchListener, ScrollTopab (attachContext as OnRefreshedListener).onSuccess(forumPageBean) } } - mRefreshLayout.finishRefresh() + mRefreshLayout?.finishRefresh() mDataBean = forumPageBean pageSize = forumPageBean.page?.pageSize?.toInt()!! forumAdapter.setData(forumPageBean) - mRefreshLayout.setNoMoreData(mDataBean!!.page?.hasMore == "0") + mRefreshLayout?.setNoMoreData(mDataBean!!.page?.hasMore == "0") reloadAdapters() } } diff --git a/app/src/main/java/com/huanchengfly/tieba/post/fragments/HistoryFragment.kt b/app/src/main/java/com/huanchengfly/tieba/post/fragments/HistoryFragment.kt index 399cb05d..ee0273c5 100644 --- a/app/src/main/java/com/huanchengfly/tieba/post/fragments/HistoryFragment.kt +++ b/app/src/main/java/com/huanchengfly/tieba/post/fragments/HistoryFragment.kt @@ -20,7 +20,6 @@ import com.huanchengfly.tieba.post.models.ThreadHistoryInfoBean import com.huanchengfly.tieba.post.models.database.History import com.huanchengfly.tieba.post.utils.DateTimeUtils import com.huanchengfly.tieba.post.utils.HistoryUtil -import kotlin.properties.Delegates class HistoryFragment : BaseFragment(), OnItemClickListener, Refreshable { @BindView(R.id.recycler_view) @@ -31,7 +30,7 @@ class HistoryFragment : BaseFragment(), OnItemClickListener, Refreshabl private val todayHistoryAdapter: HistoryAdapter by lazy { HistoryAdapter(attachContext) } private val beforeHistoryAdapter: HistoryAdapter by lazy { HistoryAdapter(attachContext) } - private var type by Delegates.notNull() + private var type = 0 companion object { const val PARAM_TYPE = "type" diff --git a/app/src/main/java/com/huanchengfly/tieba/post/fragments/SearchForumFragment.kt b/app/src/main/java/com/huanchengfly/tieba/post/fragments/SearchForumFragment.kt index 734a5edc..4c267696 100644 --- a/app/src/main/java/com/huanchengfly/tieba/post/fragments/SearchForumFragment.kt +++ b/app/src/main/java/com/huanchengfly/tieba/post/fragments/SearchForumFragment.kt @@ -31,6 +31,7 @@ class SearchForumFragment : BaseFragment(), ISearchFragment, OnItemClickListener @BindView(R.id.fragment_search_recycler_view) lateinit var recyclerView: RecyclerView + private var loaded: Boolean = false private var keyword: String? = null private val layoutManager: VirtualLayoutManager by lazy { VirtualLayoutManager(attachContext) } private val delegateAdapter: DelegateAdapter by lazy { DelegateAdapter(layoutManager) } @@ -55,7 +56,7 @@ class SearchForumFragment : BaseFragment(), ISearchFragment, OnItemClickListener refreshLayout?.autoRefresh() } else { mData = null - delegateAdapter.clear() + if (loaded) delegateAdapter.clear() } } @@ -105,6 +106,7 @@ class SearchForumFragment : BaseFragment(), ISearchFragment, OnItemClickListener private fun reloadAdapters() { delegateAdapter.clear() if (mData != null) { + loaded = true if (mData!!.exactMatch != null) { exactMatchAdapter.setData(listOf(mData!!.exactMatch!!)) delegateAdapter.addAdapter(HeaderDelegateAdapter(