【问题标题】:I'm adding data to my list but it doesn't appear in RecyclerView (Kotlin, MVVM)我正在将数据添加到我的列表中,但它没有出现在 RecyclerView(Kotlin,MVVM)中
【发布时间】:2021-09-21 13:58:06
【问题描述】:

我正在制作一个简单的应用程序。应用程序中有 2 个屏幕:列表屏幕、添加屏幕。

场景:当应用程序打开时,屏幕上有一个列表页面。用户在列表页面上的浮动操作按钮的帮助下进入添加页面。在这里,他在 Edit Text 的帮助下输入项目,然后按 Add 按钮进入 List 页面。

我在这个应用程序中使用 MVVM,我是初学者。所以我找不到问题。问题出在:我在 Add Fragment 的列表中添加了新元素,但 List Fragment 中似乎没有这些元素。

提前致谢。

模型类

data class Movie(
    val movieName: String,
    val releaseDate: String
)

ViewModel 类

class MovieViewModel : ViewModel() {
    val movies = MutableLiveData<ArrayList<Movie>>()
    var movieList = arrayListOf<Movie>()

    fun addMovie(movie: Movie) {
        movieList.add(movie)
        movies.value = movieList
    }
}

适配器类

class MovieAdapter : RecyclerView.Adapter<MovieAdapter.MyViewHolder>() {
    private var movieList = emptyList<Movie>()

    class MyViewHolder(private val binding: RowItemBinding) :
        RecyclerView.ViewHolder(binding.root) {
        fun bind(movie: Movie) {
            binding.textViewMovieName.text = movie.movieName
            binding.textViewReleaseDate.text = movie.releaseDate
        }
    }

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MyViewHolder {
        val layoutInflater = LayoutInflater.from(parent.context)
        val binding = RowItemBinding.inflate(layoutInflater, parent, false)
        return MyViewHolder(binding)
    }

    override fun onBindViewHolder(holder: MyViewHolder, position: Int) {
        val currentItem = movieList[position]
        holder.bind(currentItem)
    }

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

    fun setData(movie: List<Movie>) {
        val movieDiffUtil = MovieDiffUtil(movieList, movie)
        val movieDiffResult = DiffUtil.calculateDiff(movieDiffUtil)
        this.movieList = movie
        movieDiffResult.dispatchUpdatesTo(this)
    }
}

添加片段

class AddFragment : Fragment() {
    private var _binding: FragmentAddBinding? = null
    private val binding get() = _binding!!

    private val movieViewModel: MovieViewModel by viewModels<MovieViewModel>()

    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        _binding = FragmentAddBinding.inflate(inflater, container, false)

        binding.buttonAdd.setOnClickListener {
            insertData()
        }

        return binding.root
    }

    private fun insertData() {
        val movieName = binding.editTextMovieName.text.toString()
        val releaseDate = binding.editTextReleaseDate.text.toString()
        val movie = Movie(movieName, releaseDate)
        movieViewModel.addMovie(movie)

        findNavController().navigate(R.id.action_addFragment_to_listFragment)
    }

    override fun onDestroyView() {
        super.onDestroyView()
        _binding = null
    }
}

列表片段

class ListFragment : Fragment() {
    private var _binding: FragmentListBinding? = null
    private val binding get() = _binding!!

    private val adapter: MovieAdapter by lazy { MovieAdapter() }
    private val movieViewModel: MovieViewModel by viewModels<MovieViewModel>()

    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        _binding = FragmentListBinding.inflate(inflater, container, false)

        setAdapter()

        movieViewModel.movies.observe(viewLifecycleOwner, { data ->
            adapter.setData(data)
            binding.textView.setText(data.get(0).movieName)
        })

        binding.floatingActionButton.setOnClickListener {
            findNavController().navigate(R.id.action_listFragment_to_addFragment)
        }


        return binding.root
    }

    private fun setAdapter() {
        val recyclerView = binding.recyclerView
        recyclerView.adapter = adapter
        recyclerView.layoutManager = LinearLayoutManager(requireActivity())
    }

    override fun onDestroyView() {
        super.onDestroyView()
        _binding = null
    }
}

【问题讨论】:

    标签: kotlin android-recyclerview viewmodel android-livedata android-mvvm


    【解决方案1】:

    将一个项目添加到列表后您需要通知适配器数据已更改。

    您可以通过调用 adapter.notifyDataSetChanged() 来实现。


    我将我的列表直接添加到适配器中,但您可以创建一个类似于以下 stackoverflow 帖子的函数。

    How to update my Recyclerview using kotlin android?

    【讨论】:

      猜你喜欢
      • 2021-07-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-16
      • 2018-10-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多