簡體   English   中英

更改 recyclerview 視圖布局中的約束 - android

[英]Change constraint in recyclerview viewholder layout - android

我正在開發聊天應用程序,所以我希望TextView時間像什么應用程序一樣,它的約束可以根據文本而改變

所以我在消息布局中嘗試了視圖樹觀察器,它以某種方式工作,但缺少一些東西

 private fun adjustTimeTextView() {

        var freeSpace: Float
        var lines: Int
        val messageViewObserver = messageView.messageLayout.viewTreeObserver
        messageViewObserver.addOnGlobalLayoutListener(object : ViewTreeObserver.OnGlobalLayoutListener {

            override fun onGlobalLayout() {

                messageView.messageLayout.viewTreeObserver.removeOnGlobalLayoutListener(this)
                val viewWidth = messageView.messageLayout.width
                Log.e("message view width", viewWidth.toString())
                val layout = messageView.messageTextTextView.layout

                if (layout != null) {
                    lines = layout.lineCount
                    Log.e("line", lines.toString())

                    val offset = layout.getLineWidth(lines - 1)

                    freeSpace = viewWidth - offset
                    if (freeSpace < 220) {
                        Log.e("minmum", "low free space")
                        val constraintSet = ConstraintSet()
                        constraintSet.clone(messageView.messageLayout)
                        constraintSet.clear(messageView.messageLayout.messageTimeTextView.id, ConstraintSet.TOP)
                        constraintSet.clear(messageView.messageLayout.messageTimeTextView.id, ConstraintSet.BOTTOM)
                        constraintSet.clear(messageView.messageLayout.messageTimeTextView.id, ConstraintSet.START)
                        constraintSet.connect(
                            messageView.messageLayout.messageTimeTextView.id,
                            ConstraintSet.TOP,
                            messageView.messageLayout.messageTextTextView.id,
                            ConstraintSet.BOTTOM
                        )
                        constraintSet.applyTo(messageView.messageLayout)

                    } else {
                        if (lines > 1) {
                            val constraintSet = ConstraintSet()
                            constraintSet.clone(messageView.messageLayout)
                            constraintSet.clear(
                                messageView.messageLayout.messageTimeTextView.id,
                                ConstraintSet.START
                            )
                            constraintSet.applyTo(messageView.messageLayout)

                        }
                    }
                }
            }

        })
    }

這是我的布局 xml

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
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.support.constraint.Guideline
    android:id="@+id/endGuideline"
    android:orientation="vertical"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    app:layout_constraintGuide_percent="0.65"/>

<android.support.constraint.Guideline
    android:id="@+id/startGuideline"
    android:orientation="vertical"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    app:layout_constraintGuide_percent="0.35"/>

<android.support.constraint.ConstraintLayout
    android:id="@+id/messageLayout"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    app:layout_constrainedWidth="true"
    android:padding="4dp"
    app:layout_constraintEnd_toStartOf="@+id/endGuideline"
    android:background="@drawable/sender_message_background"
    android:orientation="vertical"
    app:layout_constraintWidth_default="wrap"
    app:layout_constraintStart_toStartOf="parent" app:layout_constraintHorizontal_bias="0.0"
    app:layout_constraintTop_toBottomOf="@+id/messageDateTextView" android:layout_marginTop="8dp">


    <TextView
        android:id="@+id/messageTextTextView"
        tools:text="hi"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.0" android:layout_marginEnd="8dp"/>

    <TextView
        android:id="@+id/messageTimeTextView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="12:34 pm"
        android:textSize="12sp"
        app:layout_constraintBottom_toBottomOf="@+id/messageTextTextView"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/messageTextTextView"
        app:layout_constraintStart_toEndOf="@+id/messageTextTextView"
        android:layout_marginStart="8dp" app:layout_constraintVertical_bias="0.51"/>
</android.support.constraint.ConstraintLayout>
</android.support.constraint.ConstraintLayout>

問題是,當我打開一個現有的聊天時,第一張圖像出現的約束在長消息中沒有按預期工作,但是一旦我點擊輸入消息編輯文本,約束就改變了屏幕聊天而不是所有聊天所以如果我滾動屏幕上的聊天限制不變,除非我單擊鍵入消息編輯文本等。

我是否缺少聽眾或請求焦點或其他東西或缺少什么

這是圖一https://i.stack.imgur.com/lBdEl.png

這是圖二在此處輸入圖片說明

它通過使 recyclerView 請求布局起作用

我將此代碼添加到 recyclerview 適配器

  override fun onAttachedToRecyclerView(recyclerView: RecyclerView) {
    super.onAttachedToRecyclerView(recyclerView)
    recyclerView.addOnScrollListener(object : RecyclerView.OnScrollListener(){
        override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) {
            super.onScrolled(recyclerView, dx, dy)
            recyclerView.requestLayout()
        }
    })
}

在我看來,這里的解決方案是使用app:layout_constrainedWidth="true" 請求布局是一項繁重的任務,不應在滾動時執行。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM