更改片段列表正在改变其他片段

问题描述 投票:1回答:1

我的活动中有一个带有两个片段的TabLayout / ViewPager。创建选项卡,然后我请求一些信息。当我收到这些信息时,我会更新每个标签的RecyclerView。

主要活动

private fun setViews() {
    val adapter = TabsAdapter(supportFragmentManager)
    adapter.addFragment(NewsFragment(), getString(R.string.dossier_activity_news))
    adapter.addFragment(PhotosFragment(), resources.getString(R.string.dossier_activity_photos))

    view_pager.adapter = adapter
    tab_layout.setupWithViewPager(view_pager)

    // request info
}

fun setPages(pages: List<Page>) {
    // got info

    ((view_pager.adapter as TabsAdapter).getItem(0) as NewsFragment).setPages(pages)
    ((view_pager.adapter as TabsAdapter).getItem(1) as PhotosFragment).setPages(pages)
}

问题是:在第二个选项卡(PhotosFragment)中,我想删除所有不包含照片/缩略图的页面。

新闻片段

fun setPages(pages: List<Page>) {
    if (pages.isNotEmpty()) recycler_view.adapter = PagesAdapter(this, pages)
}

PhotosFragment

fun setPages(pages: List<Page>) {
    val iterator = (pages as ArrayList<Page>).iterator()
    while (iterator.hasNext()) if (iterator.next().thumbnail == null) iterator.remove()
    if (pages.isNotEmpty()) recycler_view.adapter = PagesAdapter(this, pages)
}

当我在第二个选项卡上创建此迭代器时,第一个片段上的所有页面也会更新为没有照片/缩略图页面。每个片段都有自己的生命周期,通过改变一个片段的内容,它不应该更新另一个片段吗?

这可能是因为我的PagesAdapter扩展了RecyclerView吗?

PagesAdapter

class PagesAdapter(private var fragment: Fragment, private var pages: List<Page>): RecyclerView.Adapter<RecyclerView.ViewHolder>() {

    override fun onCreateViewHolder(parent: ViewGroup, type: Int): RecyclerView.ViewHolder {
        return when (type) {
            0 -> HeaderViewHolder(LayoutInflater.from(parent.context).inflate(R.layout.article_header_item, parent, false))
            else -> ArticleViewHolder(LayoutInflater.from(parent.context).inflate(R.layout.article_item, parent, false))
        }
    }

    override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
        val type = getItemViewType(position)
        when (type) {
            0 -> setHeader(holder as PagesAdapter.HeaderViewHolder, position)
            else -> setArticle(holder as PagesAdapter.ArticleViewHolder, position)
        }
    }

    inner class HeaderViewHolder internal constructor(view: View) : RecyclerView.ViewHolder(view) {
        val layout: RelativeLayout = view.article_header_layout
        val image: ImageView = view.article_header_image
        val title: AOTextView = view.title_header_text
        val date: AOTextView = view.date_header_text
    }

    inner class ArticleViewHolder internal constructor(view: View) : RecyclerView.ViewHolder(view) {
        val layout: RelativeLayout = view.article_layout
        val image: ImageView = view.article_image
        val strapline: AOTextView = view.strapline_text
        val title: AOTextView = view.title_text
        val date: AOTextView = view.date_text
    }
}

两个片段都有相同的页面列表,但我希望第二个片段过滤此列表以仅显示带有照片/缩略图的页面。通过过滤第二个片段中的列表,第一个片段显示相同的过滤列表。我可以采用不同的方式吗?或者我的代码中有一些错误?

android android-fragments android-recyclerview kotlin android-lifecycle
1个回答
2
投票

您在两个片段之间共享一个列表,这不是一个好主意。 Kotlin倾向于不变性,它应该是默认的做事方式,除非你有充分的理由。

两个片段共享列表引用,这就是为什么当其中一个更改它时,这些更改将反映在另一个片段中。

你应该做的不是

fun setPages(pages: List<Page>) {
    val iterator = (pages as ArrayList<Page>).iterator()
    while (iterator.hasNext()) if (iterator.next().thumbnail == null) iterator.remove()
    if (pages.isNotEmpty()) recycler_view.adapter = PagesAdapter(this, pages)
}

你应该写:

fun setPages(pages: List<Page>) {
    val pagesWithThumbnails = pages.filter { it.thumbnail != null }
    if (pagesWithThumbnails.isNotEmpty()) recycler_view.adapter = PagesAdapter(this, pagesWithThumbnails)
}

在那里你没有修改原始列表,同时具有更多可读和防错代码。

© www.soinside.com 2019 - 2024. All rights reserved.