fix: 修复一堆可能导致闪退的问题

This commit is contained in:
HuanChengFly 2021-02-18 19:20:00 +08:00
parent a36a8315cb
commit 31202c9dc4
12 changed files with 89 additions and 58 deletions

View File

@ -6,6 +6,7 @@ import android.content.Context
import android.content.Intent import android.content.Intent
import android.content.res.ColorStateList import android.content.res.ColorStateList
import android.os.Build import android.os.Build
import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import android.widget.Toast import android.widget.Toast
import androidx.annotation.ColorRes import androidx.annotation.ColorRes
@ -87,3 +88,7 @@ fun ViewGroup.enableChangingLayoutTransition() {
this.layoutTransition = LayoutTransition() this.layoutTransition = LayoutTransition()
this.layoutTransition.enableTransitionType(LayoutTransition.CHANGING) this.layoutTransition.enableTransitionType(LayoutTransition.CHANGING)
} }
fun View.getLocationInWindow(): IntArray {
return IntArray(2).apply { getLocationInWindow(this) }
}

View File

@ -158,6 +158,9 @@ class FloorActivity : BaseActivity() {
} }
private fun refresh() { private fun refresh() {
if (tid == null) {
return
}
refreshLayout.isRefreshing = true refreshLayout.isRefreshing = true
TiebaApi.getInstance() TiebaApi.getInstance()
.floor(tid!!, pn, pid, spid) .floor(tid!!, pn, pid, spid)

View File

@ -171,9 +171,6 @@ public class ReplyActivity extends BaseActivity implements View.OnClickListener
.findFirst(Draft.class); .findFirst(Draft.class);
if (draft != null) { if (draft != null) {
content = draft.getContent(); content = draft.getContent();
if (!TextUtils.isEmpty(content)) {
sendItem.setEnabled(true);
}
} }
} }
@ -399,10 +396,10 @@ public class ReplyActivity extends BaseActivity implements View.OnClickListener
} }
@Override @Override
public boolean onCreateOptionsMenu(Menu menu) { public boolean onCreateOptionsMenu(@NotNull Menu menu) {
getMenuInflater().inflate(R.menu.menu_reply_toolbar, menu); getMenuInflater().inflate(R.menu.menu_reply_toolbar, menu);
sendItem = menu.findItem(R.id.menu_send); sendItem = menu.findItem(R.id.menu_send);
sendItem.setEnabled(false); sendItem.setEnabled(!TextUtils.isEmpty(content));
return super.onCreateOptionsMenu(menu); return super.onCreateOptionsMenu(menu);
} }

View File

@ -92,6 +92,10 @@ class SearchPostActivity : BaseActivity() {
} }
fun refresh() { fun refresh() {
if (keyword == null || keyword == null) {
refreshLayout.finishRefresh(false)
return
}
page = 1 page = 1
getInstance().searchPost(keyword!!, forumName!!, false, page, 30).enqueue(object : Callback<SearchPostBean> { getInstance().searchPost(keyword!!, forumName!!, false, page, 30).enqueue(object : Callback<SearchPostBean> {
override fun onResponse(call: Call<SearchPostBean>, response: Response<SearchPostBean>) { override fun onResponse(call: Call<SearchPostBean>, response: Response<SearchPostBean>) {
@ -108,6 +112,10 @@ class SearchPostActivity : BaseActivity() {
} }
private fun loadMore() { private fun loadMore() {
if (keyword == null || keyword == null) {
refreshLayout.finishLoadMore(false)
return
}
getInstance().searchPost(keyword!!, forumName!!, false, page + 1, 30).enqueue(object : Callback<SearchPostBean> { getInstance().searchPost(keyword!!, forumName!!, false, page + 1, 30).enqueue(object : Callback<SearchPostBean> {
override fun onResponse(call: Call<SearchPostBean>, response: Response<SearchPostBean>) { override fun onResponse(call: Call<SearchPostBean>, response: Response<SearchPostBean>) {
val data = response.body() val data = response.body()

View File

@ -554,26 +554,36 @@ class ThreadActivity : BaseActivity(), View.OnClickListener, IThreadMenuFragment
get() { get() {
if (dataBean == null) return null if (dataBean == null) return null
val position = firstVisibleItemPosition val position = firstVisibleItemPosition
return if (position < 0) { return when {
position < 0 -> {
null null
} else if (position == 0) { }
position == 0 -> {
threadMainPostAdapter.threadPostBean ?: replyAdapter.getItem(position) threadMainPostAdapter.threadPostBean ?: replyAdapter.getItem(position)
} else { }
replyAdapter.itemCount > 0 -> {
replyAdapter.getItem(position - 1) replyAdapter.getItem(position - 1)
} }
else -> null
}
} }
private val lastVisibleItem: PostListItemBean? private val lastVisibleItem: PostListItemBean?
get() { get() {
if (dataBean == null) return null if (dataBean == null) return null
val position = getItemPositionByAdapterPosition(virtualLayoutManager.findLastVisibleItemPosition()) val position = getItemPositionByAdapterPosition(virtualLayoutManager.findLastVisibleItemPosition())
return if (position < 0) { return when {
position < 0 -> {
null null
} else if (position == 0) { }
position == 0 -> {
threadMainPostAdapter.threadPostBean ?: replyAdapter.getItem(position) threadMainPostAdapter.threadPostBean ?: replyAdapter.getItem(position)
} else { }
replyAdapter.itemCount > 0 -> {
replyAdapter.getItem(position - 1) replyAdapter.getItem(position - 1)
} }
else -> null
}
} }
private fun collect(commonAPICallback: CommonAPICallback<CommonResponse>?, update: Boolean) { private fun collect(commonAPICallback: CommonAPICallback<CommonResponse>?, update: Boolean) {

View File

@ -191,6 +191,9 @@ class UserActivity : BaseActivity() {
override fun onOptionsItemSelected(item: MenuItem): Boolean { override fun onOptionsItemSelected(item: MenuItem): Boolean {
when (item.itemId) { when (item.itemId) {
R.id.menu_block_black, R.id.menu_block_white -> { R.id.menu_block_black, R.id.menu_block_white -> {
if (profileBean == null || profileBean!!.user == null) {
return true
}
val category = if (item.itemId == R.id.menu_block_black) Block.CATEGORY_BLACK_LIST else Block.CATEGORY_WHITE_LIST val category = if (item.itemId == R.id.menu_block_black) Block.CATEGORY_BLACK_LIST else Block.CATEGORY_WHITE_LIST
Block() Block()
.setUid(profileBean!!.user!!.id) .setUid(profileBean!!.user!!.id)

View File

@ -71,7 +71,7 @@ class MessageListAdapter(
} }
) )
textView.setOnClickListener { textView.setOnClickListener {
if ("1" == item.isFloor) { if ("1" == item.isFloor && item.quotePid != null) {
FloorActivity.launch(context, item.threadId!!, postId = item.quotePid) FloorActivity.launch(context, item.threadId!!, postId = item.quotePid)
} else { } else {
ThreadActivity.launch(context, item.threadId!!) ThreadActivity.launch(context, item.threadId!!)

View File

@ -44,10 +44,10 @@ class ForumFragment : BaseFragment(), Refreshable, OnSwitchListener, ScrollTopab
lateinit var mRecyclerView: RecyclerView lateinit var mRecyclerView: RecyclerView
@BindView(R.id.refresh) @BindView(R.id.refresh)
lateinit var mRefreshLayout: SmartRefreshLayout private var mRefreshLayout: SmartRefreshLayout? = null
private lateinit var delegateAdapter: DelegateAdapter private val virtualLayoutManager: VirtualLayoutManager by lazy { VirtualLayoutManager(attachContext) }
private lateinit var virtualLayoutManager: VirtualLayoutManager private val delegateAdapter: DelegateAdapter by lazy { DelegateAdapter(virtualLayoutManager) }
private lateinit var forumAdapter: NewForumAdapter private lateinit var forumAdapter: NewForumAdapter
private lateinit var forumTopsLayoutAdapter: ForumTopsLayoutAdapter private lateinit var forumTopsLayoutAdapter: ForumTopsLayoutAdapter
private lateinit var goodClassifyLayoutAdapter: GoodClassifyLayoutAdapter private lateinit var goodClassifyLayoutAdapter: GoodClassifyLayoutAdapter
@ -56,13 +56,13 @@ class ForumFragment : BaseFragment(), Refreshable, OnSwitchListener, ScrollTopab
if (preload) { if (preload) {
PreLoader.listenData<ForumPageBean>(preloadId, DataHolder()) PreLoader.listenData<ForumPageBean>(preloadId, DataHolder())
} else if (mDataBean == null) { } else if (mDataBean == null) {
mRefreshLayout.autoRefresh() mRefreshLayout?.autoRefresh()
} }
} }
override fun onFragmentVisibleChange(isVisible: Boolean) { override fun onFragmentVisibleChange(isVisible: Boolean) {
if (isVisible && mDataBean == null) { if (isVisible && mDataBean == null) {
mRefreshLayout.autoRefresh() mRefreshLayout?.autoRefresh()
} }
} }
@ -108,8 +108,6 @@ class ForumFragment : BaseFragment(), Refreshable, OnSwitchListener, ScrollTopab
if (isGood) { if (isGood) {
classifyId = DEFAULT_CLASSIFY_ID classifyId = DEFAULT_CLASSIFY_ID
} }
virtualLayoutManager = VirtualLayoutManager(attachContext)
delegateAdapter = DelegateAdapter(virtualLayoutManager)
forumAdapter = NewForumAdapter(attachContext).apply { forumAdapter = NewForumAdapter(attachContext).apply {
setHasStableIds(true) setHasStableIds(true)
} }
@ -143,8 +141,8 @@ class ForumFragment : BaseFragment(), Refreshable, OnSwitchListener, ScrollTopab
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
mRefreshLayout.setOnRefreshListener { refresh() } mRefreshLayout!!.setOnRefreshListener { refresh() }
mRefreshLayout.setOnLoadMoreListener { loadMore() } mRefreshLayout!!.setOnLoadMoreListener { loadMore() }
mRecyclerView.apply { mRecyclerView.apply {
layoutManager = virtualLayoutManager layoutManager = virtualLayoutManager
adapter = delegateAdapter adapter = delegateAdapter
@ -172,23 +170,23 @@ class ForumFragment : BaseFragment(), Refreshable, OnSwitchListener, ScrollTopab
private fun loadMore() { private fun loadMore() {
TiebaApi.getInstance().forumPage(forumName!!, page + 1, sortType, classifyId).enqueue(object : Callback<ForumPageBean> { TiebaApi.getInstance().forumPage(forumName!!, page + 1, sortType, classifyId).enqueue(object : Callback<ForumPageBean> {
override fun onFailure(call: Call<ForumPageBean>, t: Throwable) { override fun onFailure(call: Call<ForumPageBean>, t: Throwable) {
mRefreshLayout.finishLoadMore(false) mRefreshLayout?.finishLoadMore(false)
} }
override fun onResponse(call: Call<ForumPageBean>, response: Response<ForumPageBean>) { override fun onResponse(call: Call<ForumPageBean>, response: Response<ForumPageBean>) {
page += 1 page += 1
val forumPageBean = response.body()!! val forumPageBean = response.body()!!
mRefreshLayout.finishLoadMore() mRefreshLayout?.finishLoadMore()
mDataBean = forumPageBean mDataBean = forumPageBean
pageSize = forumPageBean.page?.pageSize?.toInt()!! pageSize = forumPageBean.page?.pageSize?.toInt()!!
forumAdapter.addData(forumPageBean) forumAdapter.addData(forumPageBean)
mRefreshLayout.setNoMoreData(mDataBean!!.page?.hasMore == "0") mRefreshLayout?.setNoMoreData(mDataBean!!.page?.hasMore == "0")
} }
}) })
} }
fun refresh() { fun refresh() {
mRecyclerView.scrollToPosition(0) scrollToTop()
delegateAdapter.clear() delegateAdapter.clear()
delegateAdapter.notifyDataSetChanged() delegateAdapter.notifyDataSetChanged()
page = 1 page = 1
@ -203,10 +201,10 @@ class ForumFragment : BaseFragment(), Refreshable, OnSwitchListener, ScrollTopab
(attachContext as OnRefreshedListener).onFailure(errorCode, t.message) (attachContext as OnRefreshedListener).onFailure(errorCode, t.message)
} }
} }
mRefreshLayout.finishRefresh(false) mRefreshLayout?.finishRefresh(false)
if (errorCode == -1) { if (errorCode == -1) {
Util.showNetworkErrorSnackbar(mRecyclerView) { Util.showNetworkErrorSnackbar(mRecyclerView) {
mRefreshLayout.autoRefresh() mRefreshLayout?.autoRefresh()
} }
return return
} }
@ -220,29 +218,29 @@ class ForumFragment : BaseFragment(), Refreshable, OnSwitchListener, ScrollTopab
(attachContext as OnRefreshedListener).onSuccess(forumPageBean) (attachContext as OnRefreshedListener).onSuccess(forumPageBean)
} }
} }
mRefreshLayout.finishRefresh() mRefreshLayout?.finishRefresh()
mDataBean = forumPageBean mDataBean = forumPageBean
pageSize = forumPageBean.page?.pageSize?.toInt()!! pageSize = forumPageBean.page?.pageSize?.toInt()!!
forumAdapter.setData(forumPageBean) forumAdapter.setData(forumPageBean)
mRefreshLayout.setNoMoreData(mDataBean!!.page?.hasMore == "0") mRefreshLayout?.setNoMoreData(mDataBean!!.page?.hasMore == "0")
reloadAdapters() reloadAdapters()
} }
}) })
} }
override fun onRefresh() { override fun onRefresh() {
mRefreshLayout.autoRefresh() mRefreshLayout?.autoRefresh()
} }
override fun onSwitch(which: Int) { override fun onSwitch(which: Int) {
if (isGood && mDataBean != null) { if (isGood && mDataBean != null) {
classifyId = mDataBean!!.forum?.goodClassify?.get(which)?.classId!! classifyId = mDataBean!!.forum?.goodClassify?.get(which)?.classId!!
mRefreshLayout.autoRefresh() mRefreshLayout?.autoRefresh()
} }
} }
override fun scrollToTop() { override fun scrollToTop() {
mRecyclerView.layoutManager!!.scrollToPosition(0) virtualLayoutManager.scrollToPosition(0)
} }
interface OnRefreshedListener { interface OnRefreshedListener {
@ -253,7 +251,7 @@ class ForumFragment : BaseFragment(), Refreshable, OnSwitchListener, ScrollTopab
internal inner class DataHolder : DataListener<ForumPageBean?> { internal inner class DataHolder : DataListener<ForumPageBean?> {
override fun onDataArrived(forumPageBean: ForumPageBean?) { override fun onDataArrived(forumPageBean: ForumPageBean?) {
if (forumPageBean == null) { if (forumPageBean == null) {
mRefreshLayout.autoRefresh() mRefreshLayout?.autoRefresh()
return return
} }
if (!isGood) { if (!isGood) {
@ -261,11 +259,11 @@ class ForumFragment : BaseFragment(), Refreshable, OnSwitchListener, ScrollTopab
(attachContext as OnRefreshedListener).onSuccess(forumPageBean) (attachContext as OnRefreshedListener).onSuccess(forumPageBean)
} }
} }
mRefreshLayout.finishRefresh() mRefreshLayout?.finishRefresh()
mDataBean = forumPageBean mDataBean = forumPageBean
pageSize = forumPageBean.page?.pageSize?.toInt()!! pageSize = forumPageBean.page?.pageSize?.toInt()!!
forumAdapter.setData(forumPageBean) forumAdapter.setData(forumPageBean)
mRefreshLayout.setNoMoreData(mDataBean!!.page?.hasMore == "0") mRefreshLayout?.setNoMoreData(mDataBean!!.page?.hasMore == "0")
reloadAdapters() reloadAdapters()
} }
} }

View File

@ -172,24 +172,20 @@ class MessageFragment : BaseFragment(), Refreshable, OnTabSelectedListener, Tool
val messageListBeanCallback: Callback<MessageListBean> = object : Callback<MessageListBean> { val messageListBeanCallback: Callback<MessageListBean> = object : Callback<MessageListBean> {
override fun onResponse(call: Call<MessageListBean?>, response: Response<MessageListBean?>) { override fun onResponse(call: Call<MessageListBean?>, response: Response<MessageListBean?>) {
dataBean = response.body() dataBean = response.body()
if (dataBean == null) {
return
}
if (reload) { if (reload) {
adapter.reset() adapter.reset()
dataBean?.let { adapter.setData(it) } dataBean?.let { adapter.setData(it) }
recyclerView.scrollToPosition(0)
} else { } else {
dataBean?.let { adapter.addData(it) } dataBean?.let { adapter.addData(it) }
} }
if (reload) {
mSmartRefreshLayout.finishRefresh(true) mSmartRefreshLayout.finishRefresh(true)
if (dataBean!!.page!!.hasMore != "1") { if (dataBean?.page?.hasMore != "1") {
mSmartRefreshLayout.finishRefreshWithNoMoreData() mSmartRefreshLayout.finishRefreshWithNoMoreData()
} }
recyclerView.scrollToPosition(0)
} else {
mSmartRefreshLayout.finishLoadMore(true)
if (dataBean!!.page!!.hasMore != "1") {
mSmartRefreshLayout.finishLoadMoreWithNoMoreData()
}
}
} }
override fun onFailure(call: Call<MessageListBean?>, t: Throwable) { override fun onFailure(call: Call<MessageListBean?>, t: Throwable) {

View File

@ -159,14 +159,23 @@ class MyInfoFragment : BaseFragment(), View.OnClickListener, CompoundButton.OnCh
} }
view.findViewById<ViewGroup>(R.id.my_info_user).enableChangingLayoutTransition() view.findViewById<ViewGroup>(R.id.my_info_user).enableChangingLayoutTransition()
(followsTextView.parent as View).setOnClickListener { (followsTextView.parent as View).setOnClickListener {
if (dataBean == null || dataBean!!.data == null) {
return@setOnClickListener
}
WebViewActivity.launch(attachContext, attachContext.resources.getString(R.string.url_user_home, dataBean!!.data.getName(), 2)) WebViewActivity.launch(attachContext, attachContext.resources.getString(R.string.url_user_home, dataBean!!.data.getName(), 2))
} }
(fansTextView.parent as View).setOnClickListener { (fansTextView.parent as View).setOnClickListener {
if (dataBean == null || dataBean!!.data == null) {
return@setOnClickListener
}
WebViewActivity.launch(attachContext, attachContext.resources.getString(R.string.url_user_home, dataBean!!.data.getName(), 3)) WebViewActivity.launch(attachContext, attachContext.resources.getString(R.string.url_user_home, dataBean!!.data.getName(), 3))
} }
(threadsTextView.parent as View).setOnClickListener { (threadsTextView.parent as View).setOnClickListener {
if (dataBean == null || dataBean!!.data == null) {
return@setOnClickListener
}
goToActivity<UserActivity> { goToActivity<UserActivity> {
putExtra(UserActivity.EXTRA_UID, dataBean!!.data.getUid().toString()) putExtra(UserActivity.EXTRA_UID, "${dataBean!!.data.getUid()}")
putExtra(UserActivity.EXTRA_TAB, UserActivity.TAB_THREAD) putExtra(UserActivity.EXTRA_TAB, UserActivity.TAB_THREAD)
} }
} }

View File

@ -25,6 +25,7 @@ import com.huanchengfly.tieba.post.api.SearchThreadOrder
import com.huanchengfly.tieba.post.api.TiebaApi import com.huanchengfly.tieba.post.api.TiebaApi
import com.huanchengfly.tieba.post.api.models.SearchThreadBean import com.huanchengfly.tieba.post.api.models.SearchThreadBean
import com.huanchengfly.tieba.post.dpToPx import com.huanchengfly.tieba.post.dpToPx
import com.huanchengfly.tieba.post.getLocationInWindow
import com.huanchengfly.tieba.post.interfaces.ISearchFragment import com.huanchengfly.tieba.post.interfaces.ISearchFragment
import com.huanchengfly.tieba.post.utils.ThemeUtil import com.huanchengfly.tieba.post.utils.ThemeUtil
import com.scwang.smart.refresh.layout.SmartRefreshLayout import com.scwang.smart.refresh.layout.SmartRefreshLayout
@ -196,9 +197,7 @@ class SearchThreadFragment : BaseFragment(), ISearchFragment, NewSearchActivity.
} }
override fun openFilter(context: Context, view: View, onClose: () -> Unit) { override fun openFilter(context: Context, view: View, onClose: () -> Unit) {
val tabLocationArray = IntArray(2).apply { val tabLocationArray = view.getLocationInWindow()
view.getLocationInWindow(this)
}
FilterPopupWindow(context, order, filter).apply { FilterPopupWindow(context, order, filter).apply {
onChangedListener = object : FilterPopupWindow.OnChangedListener { onChangedListener = object : FilterPopupWindow.OnChangedListener {
override fun onChanged(popup: FilterPopupWindow, order: SearchThreadOrder, filter: SearchThreadFilter) { override fun onChanged(popup: FilterPopupWindow, order: SearchThreadOrder, filter: SearchThreadFilter) {

View File

@ -171,8 +171,11 @@ public final class NavigationHelper {
} }
private boolean navigationByUrl(String url, @NonNull String oldUrl) { private boolean navigationByUrl(String url, @NonNull String oldUrl) {
Uri uri = Uri.parse(url), if (url == null || oldUrl == null) {
oldUri = Uri.parse(oldUrl); return false;
}
Uri uri = Uri.parse(url);
Uri oldUri = Uri.parse(oldUrl);
String host = uri.getHost(), String host = uri.getHost(),
path = uri.getPath(), path = uri.getPath(),
oldHost = oldUri.getHost(), oldHost = oldUri.getHost(),