Search code examples
androidkotlinandroid-recyclerviewandroid-mvvmkoin

Android RecyclerView No adapter attached (Kotlin)


I tried to display items to my fragment recyclerview but it does not work.

E/RecyclerView: No adapter attached; skipping layout. << this is Log Message

And I'm using databinding, koin and some bases.

I think the problem occurs at this code in fragment|:

override fun initStartView() {
    viewDataBinding.recyclerView.layoutManager = LinearLayoutManager(activity)
    viewDataBinding.recyclerView.setHasFixedSize(true)
    viewDataBinding.recyclerView.adapter = postAdapter

}

this is some of BaseFragment

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

    viewDataBinding = DataBindingUtil.inflate(inflater, layoutResourceId, container, false)

    initStartView()
    initDataBinding()
    initAfterBinding()
    viewDataBinding.executePendingBindings()
    return inflater.inflate(layoutResourceId, container, false)
}

Adapter

private var postList = ArrayList<Post>()

fun setPost(postList: ArrayList<Post>) {
    Log.d("Msg", "In setPost")

    this.postList = postList
    Log.d("Data", "${postList[0].title}")
    notifyDataSetChanged()
}

override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = PostHolder(parent)

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

override fun onBindViewHolder(holder: PostHolder, position: Int) {
    postList[position].let { data ->
        with(holder) {
            title.text = data.title
            text.text = data.text
            create_at.text = data.created_at
            owner.text = data.owner
        }
    }
}

class PostHolder(parent: ViewGroup) : RecyclerView.ViewHolder(
    LayoutInflater.from(parent.context).inflate(R.layout.post_item, parent, false)
) {
    val title = itemView.text_view_title
    val text = itemView.text_view_text
    val owner = itemView.text_view_owner
    val create_at = itemView.text_view_create_time
}

Some of Koin Module

var adapterPart = module {
factory {
    PostAdapter()
}

thanks for your help


Solution

  • E/RecyclerView: No adapter attached; skipping layout.

    This error occurs when connecting failed between View (parent-child as activity-fragment).

    Try this

    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
    
        viewDataBinding = DataBindingUtil.inflate(inflater, layoutResourceId, container, false)
    
        initStartView()
        initDataBinding()
        initAfterBinding()
        viewDataBinding.executePendingBindings()
    
        //inflater.inflate(layoutResourceId, container, false)
        //You already created binding of fragment, thus you just return binding.root (container of fragment)
        return viewDataBinding.root
    }