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), 나는 제거 사진/축소를 포함하지 않는 모든 페이지를 원하는. 내가 두 번째 탭에서이 반복자를 만들 때

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

, 첫번째 조각의 모든 페이지는 어떤 사진/미리보기 페이지에 업데이트됩니다 . 각 프래그먼트는 자체 라이프 사이클을 가지고 있으며 한 프래그먼트의 내용을 변경하여 다른 프래그먼트를 업데이트하지 않아야합니다.

페이지 수 때문입니다 .Adobe 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 
    } 
} 

두 조각 같은 페이지 목록을 가지고,하지만 난 두 번째 조각의 사진/썸네일 만 페이지를 표시하려면이 목록을 필터링 할 수 있습니다. 두 번째 조각에서 목록을 필터링하면 첫 번째 조각은 동일한 필터링 된 목록을 표시합니다. 나는 이것을 다르게 적용해야 하는가? 아니면 내 코드에 버그가 있습니까?

답변

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

당신이 원래의 목록을 수정하지 않습니다.

+1

이 대답은 내 문제를 해결했습니다! 고맙습니다! – Ravers