Fragment 안의 Fragment에 Recycler view를 어떻게 해야 디스플레이가 되나요 ..?

조회수 3262회

안녕하세요~~ 이제 막 앱 만들기를 배우기 시작한 초보입니다...

제가 구상하고 있는 앱은 MainActivity 하나에 여러 Fragment들로 구성되어 있습니다. Fragment 중 하나인 UserFragment를 구상하는데 막혀서 질문 드립니다 ㅠㅠ

UserFragment 내부에 2개의 Fragment를 Viewpager 로 위치시켰습니다. 문제는, 2개의 Fragment 중 하나인 ViewplantsFragment를 Recyclerview로 구성하려고 하는데, layout은 적용이 되었으나 (background color로 확인), recycler view가 디스플레이 되지 않습니다 (오류명 : /RecyclerView: No adapter attached; skipping layout).

참고로 UserFragment 에 동일한 코드로 ViewplantsFragment 레이아웃이 아닌 UserFragment 레이아웃에 Recyclerview를 적용시키면 작동 합니다..

이 이슈로 몇일을 끙끙대고 있습니다 ㅠㅠ Fragment 안의 Fragment에 Recycler view를 어떻게 해야 디스플레이가 되나요 ..? 답변 기다리겠습니다...............!!! 감사합니다..

UserFragment.kt

class UserFragment : Fragment() {

    var fragmentView: View? = null

    var firestore: FirebaseFirestore? = null
    var currentUserUid: String? = null 
    var uid: String? = null /
    var auth: FirebaseAuth? = null

    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
        currentUserUid = FirebaseAuth.getInstance().currentUser?.uid
        auth = FirebaseAuth.getInstance()
        uid = arguments?.getString("destinationUid")
        firestore = FirebaseFirestore.getInstance()


        fragmentView = inflater.inflate(R.layout.fragment_user, container, false)

        return fragmentView
    }


//viewpager 어답터 적용
    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        user_content_viewpager.adapter = UserMainAdapter
        user_content_viewpager.offscreenPageLimit = 1

        setOnClickListener()


    }

    <-- setOnClickListener 생략 -->

}

ViewplantsFragment.kt (Viewpager에 적용될 Fragment 2개 중 하나. UserFragment 내부에 위치)

class ViewplantsFragment : Fragment() {
    var fragmentplantsView: View? = null
    var firestore: FirebaseFirestore? = null
    var uid: String? = null 
    var auth: FirebaseAuth? = null

    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {

        firestore = FirebaseFirestore.getInstance()
        uid = UserFragment().arguments?.getString("destinationUid")
        auth = FirebaseAuth.getInstance()


        fragmentplantsView = inflater.inflate(R.layout.fragment_viewplants, container, false)
        fragmentplantsView?.user_viewplants_recyclerview?.layoutManager = GridLayoutManager(activity!!, 3)
        fragmentplantsView?.user_viewplants_recyclerview?.adapter = ViewplantsFragmentRecyclerViewAdapter()

        return fragmentplantsView
    }

//본 fragment에 recyclerview를 디스플레이 하기 위한 코드
    inner class ViewplantsFragmentRecyclerViewAdapter : RecyclerView.Adapter<RecyclerView.ViewHolder>() {

        //데이터베이스에서 불러오기
        var contentDTOs: ArrayList<ContentDTO>

        init {
            contentDTOs = ArrayList()
            firestore?.collection("images")?.whereEqualTo("uid", uid)
                ?.addSnapshotListener { querySnapshot, firebaseFirestoreException ->
                    if (querySnapshot == null) return@addSnapshotListener
                    for (snapshot in querySnapshot.documents) {
                        contentDTOs.add(snapshot.toObject(ContentDTO::class.java)!!)
                    }

                    //게시물 카운터 개수
                    UserFragment().user_plants_count.text = contentDTOs.size.toString()
                    notifyDataSetChanged()
                }
        }

        override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {


            var width = resources.displayMetrics.widthPixels / 3 //화면 해상도에 맞게 3분할
            var imageview = ImageView(parent.context)
            imageview.layoutParams = LinearLayoutCompat.LayoutParams(width, width)

            return CustomViewHolder(imageview)
        }


        private inner class CustomViewHolder(var imageview: ImageView) : RecyclerView.ViewHolder(imageview) {
        }

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

        override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
            var imageview = (holder as CustomViewHolder).imageview
            Glide.with(holder.itemView.context).load(contentDTOs[position].imageUrl)
                .apply(RequestOptions().centerCrop()).into(imageview)
        }

    }
}

MainActivity.kt

class MainActivity : AppCompatActivity() ,BottomNavigationView.OnNavigationItemSelectedListener {

    override fun onNavigationItemSelected(item: MenuItem): Boolean {


        when (item.itemId) {

            <--중간 생략-->

            R.id.action_mypage -> {
                my_toolbar.visibility = View.GONE

                var userFragment = UserFragment()

                var bundle = Bundle()
                var uid = FirebaseAuth.getInstance().currentUser?.uid
                bundle.putString("destinationUid",uid) //사용자 uid 적용
                userFragment.arguments = bundle

                supportFragmentManager.beginTransaction().replace(R.id.main_content, userFragment).commit()


                return true
            }

        }
        return false
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        main_bottom_navigation.setOnNavigationItemSelectedListener(this)

        //사진 저장소 권한 부여
        ActivityCompat.requestPermissions(this, arrayOf(android.Manifest.permission.READ_EXTERNAL_STORAGE), 1)

        main_bottom_navigation.selectedItemId = R.id.action_home


    }
  • (•́ ✖ •̀)
    알 수 없는 사용자

1 답변

  • ViewplantsFragment를 보니 recyclerView에 대한 참조를 onCreateView 시점에 하고 계신데 아마 이때는 해당 recyclerView에 대한 초기화가 진행되지 않은 것으로 보입니다. 그 상태에서는 user_viewplants_recyclerview가 null일 테니 아마 adapter나 layoutmanager 세팅도 안됐을 것이고, 그러니 어댑터가 없다는 오류를 뱉어내는게 아닐싸 싶네요. onViewCreated에서 user_viewplants_recyclerview에 대한 세팅을 진행해보시기 바랍니다.

    • 답변감사합니다!! 뒤늦게 답변을 확인했네요.. 구글링을 하던중 말씀해주신대로 null을 처리해서 문제를 해결하였습니다. 늦게 답변채택해드려 죄송합니다. 좋은하루되세요! 알 수 없는 사용자 2019.7.25 22:32

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)