滚动到新的水平项目会将父垂直回收商的位置重置到顶部。嵌套的RecyclerView“图库”网格

时间:2018-11-29 16:22:55

标签: android kotlin android-recyclerview gallery recycler-adapter

我有一个垂直RecyclerView,其中包含一个包含水平RecyclerViews的视图数组。 我试图制作“ Netflix画廊”类型的视图,其中行代表类别,而其中的项代表电影。

每当我滚动到一个新的空白视图时,都会触发onBindViewHolder的水平线,它将外部垂直回收器的位置重置为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
    }
}

一旦加载了新项目,如果我返回它,它将可以滚动,但是下一个项目将重置外部回收器。

有人知道这个问题吗?

0 个答案:

没有答案