Синтетическая ошибка столкновения Kotlin - PullRequest
0 голосов
/ 23 января 2019

У меня есть фрагмент и внутри фрагмент RecyclerView с точками и статический вид с точками.

enter image description here

слушатель Adaper:

      holder.container.setOnClickListener {
            adapterListener.onItemClick(tmsLightPoint)
      }

      interface OnClickListener {
            fun onItemClick(place: TmsLightPlace)
      }

Элемент списка xml (список xml):

 <TextView
        android:id="@+id/addressTv"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center"
        tools:text="Wrocław (ul. Testowa 44, 00-007 Polska)" />

Но также при просмотре подробностей Я показываю адрес с этой точки, поэтому снова у меня есть (представление статических подробностей xml):

<TextView
            android:id="@+id/addressTv"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:gravity="center"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintRight_toRightOf="parent"
            app:layout_constraintTop_toBottomOf="@id/nameTv"
            tools:text="Wrocław (ul. Testowa 44, 00-007 Polska)" />

После нажатия на элемент списка:

 override fun onItemClick(place: TmsLightPlace) {
        LogMgr.v(TAG, "onItemClick() $place")
        addressTv?.text = place.address
 }

Адрес меняется, но не в моем представлении сведений, а в первом элементе адреса списка.

Во фрагменте у меня есть только один синтетический импорт:

import kotlinx.android.synthetic.main.fragment_points.*

Это ошибка или особенность? :)

1 Ответ

0 голосов
/ 23 января 2019

Такое поведение ожидается. То же самое произошло бы, если бы вы вызвали view.findViewById(R.id.addressTv) (что синтетическое свойство делает под капотом), потому что оно пересекало иерархию представления в глубину, а поскольку сначала стоит RecyclerView, первый элемент с таким идентификатором - это элемент списка.

У вас есть две возможности

Изменить идентификатор одного из представлений

или

Укажите другого родителя, чем сам фрагмент , чтобы искать представление, например, detailsLayout.addressTv?.text = place.address. Для этого вам понадобится следующий импорт:

import kotlinx.android.synthetic.main.fragment_points.*
import kotlinx.android.synthetic.main.fragment_points.view.*

В этом случае представление не будет кэшироваться, поэтому вы будете иметь минимальное снижение производительности.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...