0 Câu hỏi: Vị trí tái chế đặt lại bất cứ khi nào Hình ảnh được tải bằng Picasso

câu hỏi được tạo ra tại Wed, May 8, 2019 12:00 AM
Nó hoạt động rất tốt, nhưng bất cứ khi nào một hình ảnh được tải vào chế độ xem hình ảnh của nó, vị trí tái chế bên ngoài được đặt thành 0 và nó sẽ trở về hàng hình ảnh đầu tiên.

Đây là trình tái chế bên ngoài và bên trong của tôi:

bên ngoài:

class OuterPreviewRowAdapter(private var homeFeedResponse: MutableList<RelatedItemsResponse> = mutableListOf(),
                             private val onItemClick: ((Int) -> Unit)?)
    : RecyclerView.Adapter<OuterPreviewRowAdapter.ItemPreviewRowHolder>() {

    inner class ItemPreviewRowHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
        val recyclerView: RecyclerView = itemView.innerPreviewRecycler
        val categoryTitleTextView: TextView = itemView.innerListHeader
    }

    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.itemView.context, LinearLayoutManager.HORIZONTAL, false)
            layoutManager = innerLayoutManager
            adapter = InnerPreviewItemAdapter(mediaItems, onItemClick)
        }
    }

    override fun getItemCount(): Int {
        return homeFeedResponse.size
    }

    fun updateDataSetAndNotify(newFeed: List<RelatedItemsResponse>) {
        homeFeedResponse.addAll(newFeed)
    }

}

bên trong:

class InnerPreviewItemAdapter(private var mediaPreviewItems: List<ItemMediaPreviewsItem>,
                              private val onItemClick: ((ItemId: Int) -> Unit)?)
    : RecyclerView.Adapter<InnerPreviewItemAdapter.ItemPreviewHolder>() {

    inner class ItemPreviewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
        var itemTitle: TextView = itemView.itemTitle
        var itemDuration: TextView = itemView.itemDuration
        var itemPreviewImage: ImageView = itemView.itemPreviewImage
        var progressSpinnerItemPreview: View = itemView.progressSpinnerItemPreview
    }

    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)
        }

        // TODO: (broel) disabling picasso solves the gallery recycler bug.
        Picasso.get().load(mediaItem.contentPoster)
                .fit()
                .centerInside()
                .error(R.drawable.ic_missing_content)
                .into(holder.itemPreviewImage)
    }

    override fun getItemCount(): Int {
        return mediaPreviewItems.size
    }

}

Và tôi tạo trình tái chế bên ngoài trong đoạn của mình như vậy:

...

private fun setupMediaGalleryRecycler() {
        val linearLayoutManager = LinearLayoutManager(context)
        outerRecyclerAdapter = OuterPreviewRowAdapter(onItemClicked)
        outerPreviewRecycler.adapter = outerRecyclerAdapter
        outerPreviewRecycler.itemAnimator = DefaultItemAnimator()
        outerPreviewRecycler.layoutManager = linearLayoutManager
    }

...

Tôi đã cố gắng khắc phục sự cố này trong một tuần nay, nhưng sau đó tôi không thể giải quyết vấn đề này. Tôi đã thử tất cả những gì tôi có thể tìm thấy trên mạng, nhưng không có thành công cho đến nay. Những điều tôi đã thử bao gồm:

  • Cài đặt setHasStableIds(true) và ghi đè getItemId(position: Int)
  • Ghi đè getItemViewType(position: Int) để trở về vị trí
  • Truyền một nhóm xem được chia sẻ cho trình tái chế bên trong setRecycledViewPool(viewPool)
  • Thử nhiều biến thể của các tùy chọn Picasso (giữ chỗ, xử lý hình ảnh, gọi lại, v.v.) để cố gắng loại trừ điều gì đó.
  • Đạt Presenter giữ dữ liệu thay vì truyền dữ liệu.

Tôi cũng nên thêm rằng tôi chỉ thực hiện một lần tìm nạp dữ liệu ban đầu, do đó, notifyDataSetChanged chỉ được gọi lần đầu tiên (và duy nhất) đoạn được thiết lập.

Tôi rất vui được cung cấp thêm thông tin nếu cần. Tôi chỉ muốn đóng chương này và tiếp tục với dự án.

    
0
  1. Cập nhật: Tôi đã thay đổi thiết bị thử nghiệm từ Google Nexus (Android 7.1.1, API 25) sang Samsung Galaxy s10 (Android 9, API 28) và bugg biến mất. Bạn có đoán được điều gì đang diễn ra ở đây không?
    2019-05-09 09: 20: 52Z
0 Câu trả lời                              0                         
nguồn đặt đây