Fragment 안의 Fragment에 Recycler view를 어떻게 해야 디스플레이가 되나요 ..?
조회수 3264회
안녕하세요~~ 이제 막 앱 만들기를 배우기 시작한 초보입니다...
제가 구상하고 있는 앱은 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
댓글 입력