我有片段和带有Points的片段RecyclerView以及带有PointsDetail的静态视图。
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.*
是BUG还是FEATURE? :)
答案 0 :(得分:2)
该行为是预期的。如果您调用view.findViewById(R.id.addressTv)
(合成属性在后台执行),也会发生相同的情况,因为它首先深度优先于视图层次结构,并且由于RecyclerView
首先出现,因此找到具有此ID的第一项是列表项。
您有两种可能性
更改其中一个视图的ID
或
指定与片段本身不同的父对象以查找视图,例如detailsLayout.addressTv?.text = place.address
。为此,您需要以下导入:
import kotlinx.android.synthetic.main.fragment_points.*
import kotlinx.android.synthetic.main.fragment_points.view.*
在这种情况下,视图不会被缓存,因此对性能的影响最小。