片段上的更改列表正在其他片段中更改
Changing list on fragment is changing in other fragments
我有一个 TabLayout/ViewPager,在我的 activity 中有两个片段。创建选项卡,然后我请求一些信息。当我得到这些信息时,我更新每个选项卡的 RecyclerView。
主要Activity
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) 中,我想删除所有不包含 photo/thumbnail.
的页面
NewsFragment
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)
}
当我在第二个选项卡上创建此迭代器时,第一个片段上的所有页面也更新为没有 photos/thumbnails 个页面。每个片段都有自己的生命周期,通过更改一个片段的内容,它不应该更新另一个片段吗?
这可能是因为我的 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
}
}
两个片段具有相同的页面列表,但我希望第二个片段过滤此列表以仅显示具有 photos/thumbnails 的页面。通过过滤第二个片段中的列表,第一个片段显示相同的过滤列表。我应该采取不同的方式吗?还是我的代码中有错误?
您在两个片段之间共享一个列表,这不是一个好主意。
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)
}
您无需修改原始列表,同时拥有更具可读性和防错性的代码。
我有一个 TabLayout/ViewPager,在我的 activity 中有两个片段。创建选项卡,然后我请求一些信息。当我得到这些信息时,我更新每个选项卡的 RecyclerView。
主要Activity
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) 中,我想删除所有不包含 photo/thumbnail.
的页面NewsFragment
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)
}
当我在第二个选项卡上创建此迭代器时,第一个片段上的所有页面也更新为没有 photos/thumbnails 个页面。每个片段都有自己的生命周期,通过更改一个片段的内容,它不应该更新另一个片段吗?
这可能是因为我的 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
}
}
两个片段具有相同的页面列表,但我希望第二个片段过滤此列表以仅显示具有 photos/thumbnails 的页面。通过过滤第二个片段中的列表,第一个片段显示相同的过滤列表。我应该采取不同的方式吗?还是我的代码中有错误?
您在两个片段之间共享一个列表,这不是一个好主意。 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)
}
您无需修改原始列表,同时拥有更具可读性和防错性的代码。