首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >RecyclerView与ListAdapter

RecyclerView与ListAdapter
EN

Stack Overflow用户
提问于 2020-05-27 13:01:17
回答 1查看 4.3K关注 0票数 1

我正在尝试将我的适配器转换为ListAdapter,以便将来包含分页库。我的应用程序是一个基本的2段注释应用程序,第一个片段有回收者视图,第二个片段有一个EditText将文本插入到回收者视图中。我已经实现了一切,出于某种原因,在调用submitList()之后,我的回收视图没有显示任何内容。我用适配器列表来观察我的livedata列表,而我的livedata列表是从一个房间数据库中获取数据,然后将数据查询到其中。在我把适配器转换成ListAdapter之前,一切都很好

有什么建议吗?

我的适配器类:

代码语言:javascript
复制
package com.example.mvvm_example

import android.content.Context
import android.util.Log
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.TextView
import androidx.recyclerview.widget.DiffUtil
import androidx.recyclerview.widget.ListAdapter
import androidx.recyclerview.widget.RecyclerView
import com.example.mvvm_example.db.Word

interface OnItemClickListener : View.OnClickListener {
    override fun onClick(v: View?) {
    }
}

class ListAdapterCallBack : DiffUtil.ItemCallback<Word>() {
    override fun areItemsTheSame(oldItem: Word, newItem: Word): Boolean {
        return oldItem.mWord == newItem.mWord
    }

    override fun areContentsTheSame(oldItem: Word, newItem: Word): Boolean {
        return oldItem == newItem
    }
}

class WordAdapter(
    private val context: Context,
    private val onItemClickListener: OnItemClickListener
) :
    ListAdapter<Word, WordAdapter.WordViewHolder>(ListAdapterCallBack()) {
    private var wordList = listOf<Word>()

    class WordViewHolder(private val view: View) : RecyclerView.ViewHolder(view) {
        private val textView = view.findViewById<TextView>(R.id.textView)!!

        fun onBind(listener: OnItemClickListener, word: Word) {
            textView.text = word.getmWord()
            view.setOnClickListener {
                listener.onClick(view)
            }
        }
    }

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): WordViewHolder {
        val inflater = LayoutInflater.from(context)
        return WordViewHolder(inflater.inflate(R.layout.recyclerview_item, parent, false))
    }

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

    fun setWords(list: MutableList<Word>) {
        wordList = list
        notifyDataSetChanged()
    }

    override fun submitList(list: MutableList<Word>?) {
        Log.d("Adapter", "list sumbitted list is ${list.toString()}")
        super.submitList(list?.let { ArrayList(it) })
    }

    override fun onBindViewHolder(holder: WordViewHolder, position: Int) {
        val word = wordList[position]
        holder.onBind(onItemClickListener, word)

    }
}

我的第一个片段保存了回收视图:

代码语言:javascript
复制
package com.example.mvvm_example

import android.app.Activity
import android.os.Bundle
import android.util.Log
import androidx.fragment.app.Fragment
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.Button
import android.widget.Toast
import androidx.lifecycle.Observer
import androidx.lifecycle.ViewModelProvider
import androidx.lifecycle.ViewModelProviders
import androidx.navigation.fragment.findNavController
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.example.mvvm_example.db.Word
import kotlinx.android.synthetic.main.fragment_first.*

private const val TAG = "firstFrag"

class FirstFragment : Fragment() {
    private lateinit var viewModel: AppViewModel

    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        // Inflate the layout for this fragment
        Log.d(TAG, "onCreateView called")
        return inflater.inflate(R.layout.fragment_first, container, false)
    }

    override fun onActivityCreated(savedInstanceState: Bundle?) {
        Log.d(TAG, "onActivityCreated called")
        super.onActivityCreated(savedInstanceState)
        viewModel = ViewModelProviders.of(this).get(AppViewModel::class.java)

        val recyclerView = requireActivity().findViewById<RecyclerView>(R.id.recyclerview)
        val adapter =
            WordAdapter(requireActivity().applicationContext, object : OnItemClickListener {
                override fun onClick(v: View?) {
                    super.onClick(v)
                    Toast.makeText(
                        requireActivity().applicationContext,
                        "item clicked",
                        Toast.LENGTH_SHORT
                    ).show()
                }
            })

        recyclerView.adapter = adapter
        recyclerView.layoutManager = LinearLayoutManager(requireContext())
        viewModel.getAllWords().observe(requireActivity(), Observer {
            adapter.submitList(it)
        })
        fab.setOnClickListener {
            findNavController().navigate(R.id.action_FirstFragment_to_SecondFragment)
        }

        delfab.setOnClickListener {
            viewModel.deleteAllWords()
            Toast.makeText(requireContext(), "Words Deleted", Toast.LENGTH_LONG).show()
        }

    }
}

我的Word数据类:

代码语言:javascript
复制
package com.example.mvvm_example.db

import androidx.room.ColumnInfo
import androidx.room.Entity
import androidx.room.PrimaryKey
import org.jetbrains.annotations.NotNull


@Entity(tableName = "word_table")
data class Word(

    @ColumnInfo(name = "word")
    @PrimaryKey
    @NotNull
     val mWord: String
) {


    fun getmWord() = mWord
}

编辑如果我用adapter.setWords(it)切换adapter.submitList(it),它也能工作。所以肯定是submitList()方法出了问题

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-05-27 13:30:08

如果使用ListAdapter,就意味着它本身管理列表项。您应该删除您的wordList内部和方法getItemCount。对于访问数据,只调用getItem(position)方法。不需要覆盖方法submitList

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62043754

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档