RecyclerView Android Ошибка: E / RecyclerView: адаптер не подключен; пропускающий макет - PullRequest
1 голос
/ 17 апреля 2020

При попытке получить JSON данные из API и показать их в RecyclerView я получаю следующую ошибку:

Error: No adapter attached; skipping layout

Я уже иногда использую RecyclerView и никогда была эта проблема.

MainActivity:

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(activity_main)
    overwriteOnPostInteractionListener()
    setupObservers()
}

private fun setupObservers(){
    mServiceRequest.searchPostsFromAPI().observe(this, Observer { posts ->
        if (posts != null){
            loadRecyclerView()
            mPostList = posts.toMutableList()
        }
    })
}

private fun loadRecyclerView() {
    recyclerView.adapter = PostListAdapter(mPostList, mOnPostListInteractionListener)
    recyclerView.layoutManager = LinearLayoutManager(this)
    recyclerView.setHasFixedSize(true)
}

Адаптер:

class PostListAdapter(private val postList: List<PostModel>,
      private val onPostListInteractionListener: OnPostListInteractionListener):
      RecyclerView.Adapter<PostViewHolder>(){ 

override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): PostViewHolder {
    val inflate = LayoutInflater.from(parent.context)
    val view = inflate.inflate(R.layout.posts , parent, false)
    return PostViewHolder(view, parent.context, onPostListInteractionListener)
}

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

override fun onBindViewHolder(holder: PostViewHolder, position: Int) {
    holder.bindTask(postList[position])
}}

ViewHolder:

class PostViewHolder(itemView: View, private val context: Context,
                 private val onPostListInteractionListener: OnPostListInteractionListener)
                : RecyclerView.ViewHolder(itemView) {

private val postTitle = itemView.findViewById<TextView>(R.id.titleTextViewMain)
private val postBody = itemView.findViewById<EditText>(R.id.bodyEditText)

fun bindTask(post: PostModel){
    postTitle.text = post.title
    postBody.setText(post.body)
    postTitle.setOnClickListener {
        onPostListInteractionListener.onListClick(post.id)
    }
}}

Я много искал, как решить эту ошибку, но не могу.

1 Ответ

2 голосов
/ 18 апреля 2020

Вы собираете свой адаптер RecyclerView до подачи данных в список, поэтому вам нужно вызвать mPostList = posts.toMutableList() перед созданием экземпляра вашего адаптера.

Итак, измените setupObservers() на:

private fun setupObservers(){
    mServiceRequest.searchPostsFromAPI().observe(this, Observer { posts ->
        if (posts != null){
            mPostList = posts.toMutableList()
            loadRecyclerView()

        }
    })
}

Также установите свой адаптер после того, как вы полностью соберете RecyckerView. Поэтому измените порядок loadRecyclerView (), как показано ниже.

private fun loadRecyclerView() {
    recyclerView.layoutManager = LinearLayoutManager(this)
    recyclerView.setHasFixedSize(true)
    recyclerView.adapter = PostListAdapter(mPostList, mOnPostListInteractionListener)
}

Настройка RecyclerView адаптера до того, как макет может вызвать проблемы.

Примечание:

Вы создаете экземпляр своего адаптера каждый раз, когда ваш список изменилось, и это не правильный путь, и лучше создавать свои вещи (включая адаптер) только один раз в жизненном цикле, а затем создавать сеттеры каждый раз, когда вы хотите изменить их, вместо того, чтобы создавать их экземпляры снова и снова.

Таким образом, вы можете создать экземпляр вашего адаптера только один раз в методе onCreate() и создать метод в вашем адаптере, который будет принимать сообщения setPosts(private val postList: List<PostModel>) и устанавливать их внутренне ... всякий раз, когда вам нужно изменить список адаптеров, просто вызовите setPosts

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...