即使显示,RecyclerView中的视图的高度仍为0

时间:2019-01-29 15:29:51

标签: java android kotlin

我很困惑,因为在我的RecyclerView中,某些项目的高度为0(即使正确显示并可见),而某些项目的高度为正常。

那怎么可能? 如果我使用addOnGlobalLayoutListener监视高度,则将计算90%的项目正确高度,而10%的高度仍为0。 关于android如何工作的任何想法吗?

我的代码在Kotlin中,但没关系。

init {
       var heightItemView = 0
       var currentY = itemView.y
       var oldY = currentY

       itemView.viewTreeObserver.addOnGlobalLayoutListener(object : ViewTreeObserver.OnGlobalLayoutListener {
           override fun onGlobalLayout() {
               if (itemView.height > 0) {
                   heightItemView = itemView.height
                   itemView.viewTreeObserver.removeOnGlobalLayoutListener(this)
               }

我也尝试了measuredHeight()。

我的适配器上的onCreateViewHolder():

override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): PairMarketAdapter.ViewHolder {
    val v = android.view.LayoutInflater.from(parent.context)
            .inflate(R.layout.item_pair_market, parent, false)
    val holder = PairMarketAdapter.ViewHolder(v)

    holder.itemView.setOnClickListener {
        listener.onItemAction(holder.adapterPosition)
    }

    return holder
}

片段的XML:

<androidx.coordinatorlayout.widget.CoordinatorLayout 
  xmlns:android="http://schemas.android.com/apk/res/android"
  xmlns:app="http://schemas.android.com/apk/res-auto"
  xmlns:tools="http://schemas.android.com/tools"
  android:id="@+id/lCoordinatorRoot"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:orientation="vertical"
 >

<LinearLayout
   android:layout_width="match_parent"
   android:layout_height="match_parent"
   android:orientation="vertical"
  >

        <androidx.recyclerview.widget.RecyclerView
            android:id="@+id/rvPairMarket"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:clipToPadding="false"
            android:paddingTop="@dimen/spacing_normal"
            tools:listitem="@layout/item_pair_market"
            />

</LinearLayout>

项目XML:

<LinearLayout 
 xmlns:android="http://schemas.android.com/apk/res/android"
 xmlns:app="http://schemas.android.com/apk/res-auto"
 xmlns:tools="http://schemas.android.com/tools"
 android:layout_width="match_parent"
 android:layout_height="wrap_content"
 android:background="?selectableItemBackground"
 android:paddingBottom="@dimen/spacing_normal"
 android:paddingTop="@dimen/spacing_small"
 android:paddingEnd="@dimen/spacing_normal"
 android:paddingStart="@dimen/spacing_normal"
 android:orientation="horizontal"
 >

<LinearLayout
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    android:layout_marginStart="@dimen/spacing_small"
    android:layout_weight="1.5"
    android:orientation="vertical"
    >

    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        >

        <TextView
            android:id="@+id/tvSymbol"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:maxLines="1"
            android:textAllCaps="true"
            android:textColor="?android:attr/textColorPrimary"
            android:textSize="@dimen/font_large"
            android:textStyle="bold"
            tools:text="USD"
            />

        <TextView
            android:id="@+id/tvSymbolBase"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginStart="@dimen/spacing_tiny"
            android:maxLines="1"
            android:textAllCaps="true"
            android:textColor="?android:attr/textColorSecondary"
            android:textSize="@dimen/font_large"
            android:textStyle="bold"
            tools:text="BTC"
            />

        <View
            android:id="@+id/vIsSelected"
            android:layout_width="10dp"
            android:layout_height="10dp"
            android:layout_gravity="center"
            android:layout_marginStart="@dimen/spacing_small"
            android:background="@drawable/circle_green_dot"
            android:visibility="gone"
            />
    </LinearLayout>

    <TextView
        android:id="@+id/tvExchange"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="@dimen/spacing_tiny"
        android:maxLines="1"
        android:textColor="?android:attr/textColorSecondary"
        android:textSize="@dimen/font_normal"
        tools:text="1. Bitfinex"
        />
</LinearLayout>

<LinearLayout
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    android:layout_weight="1"
    android:orientation="vertical"
    >

    <TextView
        android:id="@+id/tvPercent"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="end"
        android:textColor="?android:attr/textColorPrimary"
        android:textSize="@dimen/font_large"
        tools:text="55.5%"
        />
</LinearLayout>

</LinearLayout>

1 个答案:

答案 0 :(得分:0)

itemView.measuredHeight android将尝试在显示之前测量您的视图,尝试在addOnGlobalLayoutListener内使用itemView.height