Я использую RecyclerView с LinearLayout Manager и горизонтальной ориентацией. Он должен использоваться в телевизионном приложении, поэтому его нужно перемещать с помощью dpad. Но всякий раз, когда я go делаю конец и возвращаюсь, он застревает на последнем. См. Фото:
Выбранный ItemView является первым, но он не будет go к центру. если вы go направо и вернетесь, он покажет полностью.
код:
<androidx.core.widget.NestedScrollView
android:layout_width="match_parent"
android:layout_height="320dp"
app:layout_constraintBottom_toTopOf="@+id/tv_mini_player_view_placeholder"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toBottomOf="@+id/carrier_image_card"
app:layout_constraintVertical_bias="0.10">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recycler_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginStart="@dimen/margin_start_tv_home"
android:background="@null"
android:clipToPadding="false"
android:orientation="horizontal"
android:padding="@dimen/margin_medium_big"
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
tools:context=".android.screens.auth.SelectCarrierActivity"
tools:listitem="@layout/imagecardview_station" />
</androidx.core.widget.NestedScrollView>
Одна небольшая вещь, которую я заметил, это расположение, которое World Hits не корректировало. размер этикетки. Когда выбрано, эти макеты показывают описание, которое делает прозрачную серую рамку больше для размещения. Это изменение «View.GONE» на метке описания. Таким образом, последний выбранный макет описания исчез, но макет не был перенастроен. Код для части держателя вида ниже:
inner class StationViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
val mainImageView: ImageView by lazy { itemView.findViewById<ImageView>(R.id.main_image) }
val titleView: TextView by lazy { itemView.findViewById<TextView>(R.id.title_text) }
val descriptionView: TextView by lazy { itemView.findViewById<TextView>(R.id.description_text) }
init {
val frameLayout = itemView.findViewById<FrameLayout>(R.id.frame_layout)
val cardView = itemView.findViewById<FrameLayout>(R.id.cardview)
cardView.apply {
isFocusable = true
isFocusableInTouchMode = true
onFocusChangeListener = View.OnFocusChangeListener { v, hasFocus ->
if (hasFocus) {
AbstractCardPresenter.animateScaleUp(cardView as View)
frameLayout.background = itemView.context.resources.getDrawable(R.drawable.card_border)
descriptionView.visibility = View.VISIBLE
} else {
AbstractCardPresenter.animateScaleDown(cardView as View)
frameLayout.background = null
descriptionView.visibility = View.GONE
}
}
}
itemView.onAttachStateChangeListener {
onViewAttachedToWindow {
if (adapterPosition == 0) {
cardView.requestFocus()
}
}
}
}
}