【发布时间】:2020-09-13 14:19:53
【问题描述】:
我想使用一个动态调整高度的viewpager,所以我创建了一个custompager并尝试构建它,但是我得到了以下错误。 由 at.ViewPagerAdapter.setPrimaryItem(ViewPagerAdapter.kt:34) 引起的错误 at.CustomPager.onMeasure(CustomPager.kt:22) 有人可以帮忙吗?
下面是我发生错误的代码。
class CustomPager : ViewPager {
private var mCurrentView: View? = null
constructor(context: Context?) : super(context!!) {}
constructor(context: Context?, attrs: AttributeSet?) : super(
context!!,
attrs
) {
}
public override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {
var heightMeasureSpec = heightMeasureSpec
if (mCurrentView == null) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec)
return
}
var height = 0
mCurrentView!!.measure(
widthMeasureSpec,
MeasureSpec.makeMeasureSpec(
0,
MeasureSpec.UNSPECIFIED
)
)
val h = mCurrentView!!.measuredHeight
if (h > height) height = h
heightMeasureSpec = MeasureSpec.makeMeasureSpec(
height,
MeasureSpec.EXACTLY
)
super.onMeasure(widthMeasureSpec, heightMeasureSpec)
}
fun measureCurrentView(currentView: View?) {
mCurrentView = currentView
requestLayout()
}
fun measureFragment(view: View?): Int {
if (view == null) return 0
view.measure(0, 0)
return view.measuredHeight
}
}
class ViewPagerAdapter(fragmentManager: FragmentManager) : FragmentPagerAdapter(fragmentManager) {
private val mFragmentList: ArrayList<Fragment> = ArrayList()
private val mFragmentTitleList: ArrayList<String> = ArrayList()
private var mCurrentPosition = -1
override fun getPageTitle(position: Int): CharSequence? {
return mFragmentTitleList[position]
}
override fun getItem(position: Int): Fragment {
return mFragmentList[position]
}
override fun getCount(): Int {
return mFragmentList.size
}
override fun setPrimaryItem(container: ViewGroup, position: Int, `object`: Any) {
super.setPrimaryItem(container, position, `object`)
if (position != mCurrentPosition) {
val fragment = `object` as Fragment?
val pager = container as CustomPager
if (fragment != null && fragment.view != null) {
mCurrentPosition = position
pager.measureCurrentView(fragment.view)
}
}
}
fun addFragment(fragment: Fragment, title: String) {
mFragmentList.add(fragment)
mFragmentTitleList.add(title)
}
}
【问题讨论】: