-
Notifications
You must be signed in to change notification settings - Fork 5.2k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
StateView的占用高度(宽度)似乎存在BUG #3850
Comments
|
internal class StateLayoutVH(
parent: ViewGroup,
stateView: View?,
private val stateLayout: FrameLayout = FrameLayout(parent.context).apply {
layoutParams = ViewGroup.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT
)
setStateView(this, stateView)
}
) : RecyclerView.ViewHolder(stateLayout), FullSpanAdapterType {
fun changeStateView(stateView: View?) {
setStateView(stateLayout, stateView)
}
companion object {
private fun setStateView(rootView: ViewGroup, stateView: View?) {
if (stateView == null) {
rootView.removeAllViews()
return
}
if (rootView.childCount == 1) {
val old = rootView.getChildAt(0)
if (old == stateView) {
// 如果是同一个view,不进行操作
return
}
}
stateView.parent.run {
if (this is ViewGroup) {
this.removeView(stateView)
}
}
if (stateView.layoutParams == null) {
stateView.layoutParams = FrameLayout.LayoutParams(
FrameLayout.LayoutParams.WRAP_CONTENT, FrameLayout.LayoutParams.WRAP_CONTENT
).apply {
gravity = Gravity.CENTER
}
}else{
//判断stateView高度,如果不是MATCH_PARENT则把RootView的高度改为WRAP_CONTENT
if (stateView.layoutParams.height == ViewGroup.LayoutParams.MATCH_PARENT){
rootView.layoutParams.height = ViewGroup.LayoutParams.MATCH_PARENT
}else{
rootView.layoutParams.height = ViewGroup.LayoutParams.WRAP_CONTENT
}
//判断stateView宽度,如果不是MATCH_PARENT则把RootView的高度改为WRAP_CONTENT
if (stateView.layoutParams.width == ViewGroup.LayoutParams.MATCH_PARENT){
rootView.layoutParams.width = ViewGroup.LayoutParams.MATCH_PARENT
}else{
rootView.layoutParams.width = ViewGroup.LayoutParams.WRAP_CONTENT
}
}
rootView.removeAllViews()
rootView.addView(stateView)
}
}
} |
#3851 已提交PR,上面那个例子没有处理自动居中的情况,PR里进行了相应的兼容,并且运行demo大概看了下,没啥错误,请作者过目。不知道改动是否合理,作者也可以给出意见,谢谢。 |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
触发这个问题的需求是这样的,很简单。
RecyclerView
的高度是包裹,而不是撑满布局。使用的
占位View
高度同样包裹或者一个不大的高度值。本来想实现的效果是,无数据的时候,
ReclerView
底部不会存在大量空白高度。这时候关键点来了,我发现,当你使用
QuickAdapterHelper
调用addBeforeAdapter
添加Header
时,每添加一个BeforeAdapter
,ContentAdapter
对应内容区域的高度就会增加一个BeforeAdapter
的高度,直到撑满一个父布局。简单来说就是
ContentAdapter
对应内容区域会自动变高直到撑满他能撑满的布局高度。造成的问题,1,就算RecyclerView
的高度没有达到父布局高度,按照常理RecyclerView
应该是无法进行滑动的,但是因为ContentAdapter
对应内容区域的高度大于占位View
的高度,所以RecyclerView
竟然可以滑动。2,就算RecyclerView
高度达到了父布局高度,同样因为此时ContentAdapter
对应内容区域的高度也变成了父布局的高度,那么RecyclerView
下方会滑动出来大量的空白,说白了,这时候ContentAdapter
对应内容区域的高度已经不是占位View
的高度了,变成了HeaderView
总高度+占位View
的高度,直到占满父布局,我认为这是个BUG。ContentAdapter
对应内容区域的高度应该永远和要显示的占位View
高度保持一致不是么???只要不添加Header
,ContentAdapter
对应内容区域确实可以保证他跟占位View
的高度是一致的。但是只要添加了Header
,ContentAdapter
对应内容区域的高度就会开始变高,这真的不太对吧?使用的是4.1.4版本,可以用demo比较容易的重现此问题。如需要我可以上传github提供
就如上面2个图简单演示,
RecyclerView
内容高度本应该是图1的高度,实际也是,但是就像图2,它内部的滑动区域的高度却无端的高了一个Header
的高度。这真的就是个BUG吧?The text was updated successfully, but these errors were encountered: