Android 如何在RecyclerView中设置所有项目的宽度相同?

Android 如何在RecyclerView中设置所有项目的宽度相同?,android,android-layout,android-recyclerview,Android,Android Layout,Android Recyclerview,我想将所有项目的宽度设置为相同。因为视图周围有一条线,一些文本是长的,而另一些是短的。所以,这些东西看起来像楼梯之类的,但我希望它们看起来干净。(也许,我将来也需要设定同样的高度。) 我想设置项目中最长文本的所有宽度和高度 我设定了这三个值 var maxLength = 0 var maxWidth = 0 var longestP = 0 并且,无论何时设置新数据,都会初始化这些值 fun setData(data: ArrayList<AnswerData>?, mi

我想将所有项目的宽度设置为相同。因为视图周围有一条线,一些文本是长的,而另一些是短的。所以,这些东西看起来像楼梯之类的,但我希望它们看起来干净。(也许,我将来也需要设定同样的高度。)

我想设置项目中最长文本的所有宽度和高度

我设定了这三个值

var maxLength = 0
var maxWidth = 0
var longestP = 0
并且,无论何时设置新数据,都会初始化这些值

    fun setData(data: ArrayList<AnswerData>?, min: Int?, max: Int?) {
        if (data == null) {
            items = ArrayList()
        } else {
            data.forEach {
                it.isChecked = false
            }
            this.items = data
        }

        this.min = min ?: -1
        this.max = max ?: 30
        maxLength = 0
        maxWidth = 0
        longestP = 0

        notifyDataSetChanged()
    }
它是resizeView()


有什么问题?

您可以将单个视图的宽度设置为
匹配父视图
,将
回收视图
的宽度设置为
包裹内容
。这样,所有视图都将具有相同的宽度,而不是固定的宽度,这取决于最长的视图。如果文本太长,
TextView
将自动将文本换行到下一行

我的代码:

供回收商查看


对于单个项目(我使用的是CardView)


我更改了适配器中的某些部分,它可以正常工作

    var maxLength = 0
    var maxWidth = 0
    var maxHeight = 0
    var longestP = 0
fun setData(数据:ArrayList?){
...
maxLength=0
maxWidth=0
最大高度=0
longestP=0
...
}
for(i在0中直到items.size){
val length=项目[i]。标签!!.length
如果(长度>最大长度){
最大长度=长度
longestP=i
}
}
if(longestP==位置){
maxWidth=holder.tv!!.width
maxHeight=holder.tv!!.height
项目[位置]。宽度=最大宽度
项目[位置]。高度=最大高度
}else if(holder.tv!!.width

诀窍在于数据模型具有宽度和高度值。并在项目视图的宽度或高度大于0时设置它们。

如果要设置固定大小,为什么不在xml文件中设置高度和宽度?我想用最长的文本调整宽度和高度。而且最长的文本每次都不一样。(想不到。)@STyes。如果可以剪切长文本,则可以设置maxLine或maxWidth以使其适合。如果无法剪切文本,则可以设置固定宽度,并使文本自动滚动以显示全文内容(请参阅此处:)。否则,您可以设置固定宽度,并允许文本扩展到2-3行。不,这与我想要实现的不同。我想将所有项目视图设置为其中最长的项目。每个API调用的项都不同。它可以是113dp或52dp,或者我不知道。宽度应灵活,同时,所有项目必须具有相同的宽度@你试过了吗?我不会工作。当父视图包装子视图并且子视图想要匹配父视图时…我已经尝试过了。你能发布你的XML代码吗?谢谢。父视图是
RecyclerView
,子视图是项目的自定义布局(例如
single_item.xml
),您可以在答案中共享代码吗?如果父对象包装子对象且子对象与父对象匹配,则它将等效于唯一子对象包装子对象。当项目具有固定值(如XXdp或wrap_内容)时,包装将起作用。
    private fun resizeView(view: View, newWidth: Int, newHeight: Int) {
        Log.d("size", "$newWidth, $newHeight")
        val params = view.layoutParams
        params.width = newWidth
        params.height = newHeight
        view.layoutParams = params
    }
    var maxLength = 0
    var maxWidth = 0
    var maxHeight = 0
    var longestP = 0
    fun setData(data: ArrayList<AnswerData>?) {
        ...

        maxLength = 0
        maxWidth = 0
        maxHeight = 0
        longestP = 0

        ...
    }
    for( i in 0 until items.size){
        val length = items[i].label!!.length
        if( length > maxLength){
            maxLength = length
            longestP = i
        }
    }

    if(longestP == position){
        maxWidth = holder.tv!!.width
        maxHeight = holder.tv!!.height
        items[position].width = maxWidth
        items[position].height = maxHeight
    }else if(holder.tv!!.width < maxWidth){
        items[position].width = maxWidth
        items[position].height = maxHeight
        resizeView(holder.tv!!, items[position].width, items[position].height)
    }