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

我有一个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) { // 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 )中,我想删除所有不包含照片/缩略图的页面。

NewsFragment

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

PhotosFragment

 fun setPages(pages: List) { val iterator = (pages as ArrayList).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): RecyclerView.Adapter() { 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 } } 

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

  • 从(现有的)Kotlin程序启动TornadoFX应用程序
  • 价值虚构之后,智能投射到“布尔”是不可能的
  • =?UTF Q + 新闻组字符串从ASCII到Unicode
  • 找不到id为`kotlin`的插件
  • Kotlin - 使用“懒”与“lateinit”的属性初始化
  • 如何在Kotlin中初始化List <T>?
  • 我怎样才能改变ColorPrimaryDark只是一个活动?
  • 方法hashMapOf()在Kotlin中
  • One Solution collect form web for “更改片段列表正在改变其他片段”

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

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

    你应该做的是,而不是

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

    你应该写:

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

    在那里你不要修改原始列表,同时拥有更多可读和防错码。

    Kotlin language will be the best programming language for Android.