E/RecyclerView:没有连接适配器;跳过 Android 中的布局,kotlin

E/RecyclerView: No adapter attached; skipping layout in Android, kotlin

我在我的应用程序中使用 Kotlin 使用 Refrofit、MVVM、DataBinding、Coroutines 实现了 RecyclerView。相同的代码在另一个片段中可以正常工作,但在这里不行。 *注意:改装功能 returns commentsList 成功但仅在 recyclerView 中显示列表时出现问题。

  override fun onActivityCreated(savedInstanceState: Bundle?) {
    super.onActivityCreated(savedInstanceState)
    val api = ApiRepository()
    factory = CommentsViewModelFactory(api)
    viewModel = ViewModelProvider(this, factory).get(CommentsViewModel::class.java)
    viewModel.getComments(requireActivity())
    viewModel.commentsList.observe(viewLifecycleOwner, Observer { comments ->
        rvComment.also {
            it.layoutManager = LinearLayoutManager(requireContext())
            it.setHasFixedSize(true)
            if (comments != null) {
                it.adapter = HomeServicesCommentsAdapter(comments, this)
            } 
        }

    })
}

ViewModel 看起来像这样,我将注释声明为 MutableLiveData,returns 数据成功,但唯一的问题是适配器附件。

class CommentsViewModel(private val repository: ApiRepository) : ViewModel() {
var userComment: String? = null

private val comments = MutableLiveData<List<Comment>>()
private lateinit var job: Job

val commentsList: MutableLiveData<List<Comment>>
    get() = comments

fun getComments(context: Context) {
    job = CoroutinesIO.ioThenMain(
        {
            repository.getServices(context)
        }, {
            for (i in it!!.data.data)
                comments.value = i.comments
        }


    )
}

这是适配器实现

class HomeServicesCommentsAdapter(
    private val comments: List<Comment>,
    private val listenerService: RvListenerServiceComments
) : RecyclerView.Adapter<HomeServicesCommentsAdapter.ServicesViewHolder>() {

    override fun getItemCount() = comments.size


    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) =
        ServicesViewHolder(
            DataBindingUtil.inflate(
                LayoutInflater.from(parent.context),
                R.layout.custom_comment_layout,
                parent,
                false
            )
        )

    override fun onBindViewHolder(holder: ServicesViewHolder, position: Int) {
        holder.recyclerViewServicesBinding.comments = comments[position]
        notifyDataSetChanged()
    }

    class ServicesViewHolder(
        val recyclerViewServicesBinding: CustomCommentLayoutBinding
    ) : RecyclerView.ViewHolder(recyclerViewServicesBinding.root)

}

如果您需要 xml 布局文件,请告诉我。

而不是在运行时在观察数据时给布局管理器, 在 xml

中定义 layoutmanager

例如:

<androidx.recyclerview.widget.RecyclerView
                    android:id="@+id/rvNews"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:nestedScrollingEnabled="false"
                    tools:listitem="@layout/item_your_layout"
                    app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager" />

从观察者中删除以下行

it.layoutManager = LinearLayoutManager(requireContext())

编辑: 观察数据时不要创建适配器实例,因为观察数据不在 MainThread 上所以请确保在 MainThread

上设置数据
val adapter = HomeServicesCommentsAdapter(arrayListOf(), this)
        rvComment?.adapter = adapter
        viewModel.getComments(requireActivity())
        viewModel.commentsList.observe(viewLifecycleOwner, Observer { comments ->
                    comments?.let{adapter.setData(comments)}//define setData(list:ArrayList<Comments>) method in your adapter 
               
        })

HomeServicesCommentsAdapter.kt:

........
private var mObjects: MutableList<Comment>? = ArrayList()// top level declaration

fun setData(objects: List<Comment>?) {
        this.mObjects = objects as MutableList<Comment>
        this.notifyDataSetChanged()
    }
......