У меня есть вертикальный RecyclerView с массивом представлений, содержащих горизонтальные RecyclerViews.Я пытаюсь создать вид «Галерея Netflix», где строки представляют категории, а элементы в них представляют фильмы.
Всякий раз, когда я прокручиваю до нового пустого представления, которое вызывает горизонтали наBindViewHolder, оно сбрасывает внешнюю вертикаль.позиция переработчика до 0 (строка первой категории).
Вот фрагмент и код адаптера:
class GalleryFragment: Fragment(), GalleryMVP.View {
private var outerRecyclerAdapter: OuterPreviewRowAdapter? = null
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
return inflater.inflate(R.layout.fragment_watch, container, false)
}
override fun onActivityCreated(savedInstanceState: Bundle?) {
super.onActivityCreated(savedInstanceState)
presenter = WatchPresenter(this)
setupMediaGalleryRecycler()
presenter.getMoviesByCategory()
}
private fun setupMediaGalleryRecycler() {
val linearLayoutManager = LinearLayoutManager(context)
outerRecyclerAdapter = OuterPreviewRowAdapter(onItemClick = onItemClicked)
outerPreviewRecycler.adapter = outerRecyclerAdapter
outerPreviewRecycler.itemAnimator = DefaultItemAnimator()
outerPreviewRecycler.layoutManager = linearLayoutManager
}
override fun onMoviesByCategoryFetched(newCategoryFeed: List<RelatedItemsResponse>) {
activity?.runOnUiThread {
outerRecyclerAdapter?.updateDataSetAndNotify(newCategoryFeed)
}
}
}
Внешний переработчик:
class OuterPreviewRowAdapter(private var homeFeedResponse: MutableList<RelatedItemsResponse> = mutableListOf(),
private val onItemClick: ((Int) -> Unit)?)
: RecyclerView.Adapter<OuterPreviewRowAdapter.ItemPreviewRowHolder>() {
private var viewPool = RecyclerView.RecycledViewPool()
override fun onCreateViewHolder(parent: ViewGroup, p1: Int): ItemPreviewRowHolder {
val itemRow = LayoutInflater.from(parent.context)
.inflate(R.layout.component_item_preview_row, parent, false)
return ItemPreviewRowHolder(itemRow)
}
override fun onBindViewHolder(holder: ItemPreviewRowHolder, position: Int) {
val categoryModel = homeFeedResponse[position]
val mediaItems = categoryModel.itemMediaPreviews?.filterNotNull() ?: listOf()
holder.categoryTitleTextView.text = categoryModel.categoryName
holder.recyclerView.apply {
val innerLayoutManager = LinearLayoutManager(holder.recyclerView.context, LinearLayoutManager.HORIZONTAL, false)
innerLayoutManager.initialPrefetchItemCount = 5
layoutManager = innerLayoutManager
adapter = InnerPreviewItemAdapter(mediaItems, onItemClick)
setRecycledViewPool(viewPool)
}
}
override fun getItemCount(): Int {
return homeFeedResponse.size
}
fun updateDataSetAndNotify(newFeed: List<RelatedItemsResponse>) {
homeFeedResponse.clear()
homeFeedResponse.addAll(newFeed.toMutableList())
notifyDataSetChanged()
}
inner class ItemPreviewRowHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
val recyclerView: RecyclerView = itemView.innerPreviewRecycler
val categoryTitleTextView: TextView = itemView.innerListHeader
}
}
Внутренний переработчик:
class InnerPreviewItemAdapter(private var mediaPreviewItems: List<ItemMediaPreviewsItem>,
private val onItemClick: ((ItemId: Int) -> Unit)?)
: RecyclerView.Adapter<InnerPreviewItemAdapter.ItemPreviewHolder>() {
override fun onCreateViewHolder(parent: ViewGroup, p1: Int): ItemPreviewHolder {
val previewItemView = LayoutInflater.from(parent.context)
.inflate(R.layout.component_item_preview_item, parent, false)
return ItemPreviewHolder(previewItemView)
}
override fun onBindViewHolder(holder: ItemPreviewHolder, position: Int) {
val mediaItem = mediaPreviewItems[position]
holder.apply {
mediaItem.id?.let { itemId -> itemView.setOnClickListener { onItemClick?.invoke(itemId) } }
progressSpinnerItemPreview.visibility = View.VISIBLE
itemTitle.text = mediaItem.title
// itemDuration.text = itemDuration.context.getString(R.string.MINUTES_WITH_ARGUMENT, mediaItem.length)
Picasso.get()
.load(mediaItem.contentPoster)
.fit()
.centerInside()
.error(R.drawable.ic_missing_content)
.into(itemPreviewImage, object : Callback {
override fun onSuccess() {
holder.progressSpinnerItemPreview.visibility = View.GONE
}
override fun onError(e: Exception?) {
holder.progressSpinnerItemPreview.visibility = View.GONE
}
})
}
}
override fun getItemCount(): Int {
return mediaPreviewItems.size
}
inner class ItemPreviewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
var itemPreviewImage: ImageView = itemView.itemPreviewImage
var progressSpinnerItemPreview: View = itemView.progressSpinnerItemPreview
var itemTitle: TextView = itemView.itemTitle
var itemDuration: TextView = itemView.itemDuration
}
}
После загрузки нового элемента его можно будет прокручивать, если я вернусь к нему, однако следующий элемент перезагрузит внешний ресайклер.
Кто-нибудь распознает эту проблему?