Прокрутка к новому горизонтальному элементу сбрасывает положение родительского вертикального рециклера в верхнюю часть.Укрытый RecyclerView "Галерея" Сетка - PullRequest
0 голосов
/ 29 ноября 2018

У меня есть вертикальный 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
    }
}

После загрузки нового элемента его можно будет прокручивать, если я вернусь к нему, однако следующий элемент перезагрузит внешний ресайклер.

Кто-нибудь распознает эту проблему?

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