@PoisonousHeart

Нет изменения данных на UI?

Расширил FrameLayout . Связал с этим кастомным View некоторый layout. Хочу использовать его для отображения данных через кастомное свойство (для этого используется BindingAdapter, т.к. в будущем туда будет прокидываться один из классов реализующий некоторый интерфейс, поэтому attr.xml Не подходит). Использование этого кастомного View планируется через xml, поэтому управление им из кода не есть гуд. В идеале, срабатывает биндинг адаптер и выполняется кастомная логика над данными в нем и внутри меняются состояния компонентов на layout, который связан с этим кастомным View в конструкторе. Использование этого кастомного View планируется также и в Recycler, прошу учесть этот момент. Для простоты примера, я вытащил из Recycler-а кастомный View и кинул его просто н фрагмент. Он также не работает. Если добавить статический текст (то отображение его есть), то есть отсутствуют на ui изменения, которые должны произойти при срабатывании биндинга, но через дебаг режим биндинг срабатывает.

Код кастомного View :
class RecalculateView : FrameLayout {
    lateinit var binding: ViewRecalculateLayoutBinding
    lateinit var name: String

    constructor(context: Context) : super(context){
        initView(context)
    }
    constructor(context: Context, attrs: AttributeSet?) : super(context, attrs){
        initView(context)
    }
    constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int) : super(context, attrs, defStyleAttr){
        initView(context)
    }



    private fun initView(context: Context){// Связать файл разметки с текущим View
        inflate(context, R.layout.view_recalculate_layout, this) // связать xml и view
        binding = ViewRecalculateLayoutBinding.inflate(
            LayoutInflater.from(context)
        )
    }
}

@BindingAdapter(value = ["setName"], requireAll = true)
fun <ITEM: String> RecalculateView.name(item: ITEM?){
    item?.let{
        binding.tex.text = it
    }
}


код связанного с ним слоя view_recalculate_layout.xml:
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">

        <TextView
            android:id="@+id/tex"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:textColor="@color/black"/>
</layout>


код разметки фрагмента, на котором отображение должно происходить:
<?xml version="1.0" encoding="utf-8"?>
<layout 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">
<androidx.constraintlayout.widget.ConstraintLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <ru.startex.app.basic_recalculate.RecalculateView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:setName="@{`it is hell`}"/>

</androidx.constraintlayout.widget.ConstraintLayout>
</layout>
  • Вопрос задан
  • 87 просмотров
Решения вопроса 1
@PoisonousHeart Автор вопроса
1. Внутри view:
binding = ViewRecalculateLayoutBinding.inflate(
            LayoutInflater.from(context),
            this,
            true
        )


2. Завести интерфейс:
interface Childs {
    fun getTextView(): TextView
}


3. Наследуемся от Интерфейса вьюхой
class RecalculateView :  Childs, LinearLayoutCompat{
...
}


4. Переопределяем:
...
override fun getTextView() = binding.tex
...
}

5. Ну и Адаптер:
@BindingAdapter(value =["customText"], requireAll = false)
fun <T: String> setCustom(view: RecalculateView ?, item: T?){
    item?.let{
        view?.getTextView()?.text = it
    }
}
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы