代码之家  ›  专栏  ›  技术社区  ›  Foobar

如何在RecyclerView中查找项目宽度?

  •  2
  • Foobar  · 技术社区  · 7 年前

    我有一个 recyclerview 这只是一个水平的按钮列表。我正在尝试创建以下行为:

    如果所有按钮的总宽度小于屏幕的总宽度,则将每个按钮的宽度设置为(屏幕宽度/按钮数)。

    我正在测试一些基本代码来获取/设置按钮宽度,就像我的 adapter 班级:

     override fun onBindViewHolder(holder: TabViewHolder, position: Int) {
    
            Log.d("TEST-APP","Button Width: " + holder.button.width.toString())
    
            holder.button.width = 1080
    
            Log.d("VED-APP","New Button Width: " + holder.button.width.toString())
    
            holder.button.text = items[position].first
            holder.button.setOnClickListener {
                (context as MainActivity).updateCurrentImageLayout(items[position].second)
            }
        }
    

    奇怪的是,虽然这段代码确实将按钮的宽度更改为1080,但这两个按钮的输出 Log 按钮宽度设置前后的功能均为0。

    如何获取按钮的实际宽度?

    这是我的布局,它定义了 回收视图 :

    <?xml version="1.0" encoding="utf-8"?>
    <android.support.constraint.ConstraintLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="wrap_content"
        android:layout_height="match_parent">
    
        <Button
            android:id="@+id/tabButton"
            android:layout_width="match_parent"
            android:minWidth="120dp"
            android:layout_height="match_parent"
            android:text="Unset-Button-Text"/>
    
    
    </android.support.constraint.ConstraintLayout>
    
    1 回复  |  直到 7 年前
        1
  •  1
  •   TpoM6oH    7 年前

    Android仅在小部件被测量之后才返回其宽度,并且其发生时间晚于 onBindViewHolder 被调用。

    您可以延迟请求:

    holder.button.post {
        Log.d("VED-APP","New Button Width: " + holder.button.width.toString()) 
    };