简体   繁体   English

如何清除我的 recyclerView 数据? 我从同类型的问题中尝试了很多东西,但没有任何帮助

[英]How can i clear my recyclerView data? I have tried a lot of stuff from same type of questions but nothing has helped me

Search Movies Fragment搜索电影片段

package com.example.moviemania.views
import android.os.Binder
import android.os.Bundle
import android.text.Editabl
import android.text.TextWatcher
import androidx.fragment.app.Fragment
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.EditText
import android.widget.Toast
import androidx.fragment.app.viewModels
import androidx.navigation.fragment.findNavController
import androidx.recyclerview.widget.GridLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.example.moviemania.adapters.MovieAdapter
import com.example.moviemania.models.Movie
import com.example.moviemania.models.Movies
import com.example.moviemania.R
import com.example.moviemania.databinding.FragmentSearchMoviesBinding
import com.example.moviemania.viewModels.FavViewModel
import com.example.moviemania.viewModels.MovieViewModel


class SearchMoviesFragment : Fragment() {
    private lateinit var recyclerView: RecyclerView
    private val viewModel: MovieViewModel by viewModels()
    private val favViewModel: FavViewModel by viewModels()
    private lateinit var binding:FragmentSearchMoviesBinding

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
    }

    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        // Inflate the layout for this fragment
        binding = FragmentSearchMoviesBinding.inflate(layoutInflater,container,false)
        return binding.root
    }

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {

        val toolbar = binding.toolbarSearchMoviesFragment
        (activity as MainActivity).setSupportActionBar(toolbar)
        (activity as MainActivity).getSupportActionBar()?.setDisplayShowHomeEnabled(true)
        (activity as MainActivity).getSupportActionBar()?.setDisplayHomeAsUpEnabled(true)
        toolbar.setNavigationOnClickListener {
            (activity as MainActivity).onBackPressed()
        }

        super.onViewCreated(view, savedInstanceState)
        recyclerView = binding.rvSearchMovie
        observeSearchResults()
        setListenersForSearch()
        observeResponseText()

    }

    private fun observeResponseText() = viewModel.responseText.observe(viewLifecycleOwner) {
        //Toast.makeText(this,it.toString(),Toast.LENGTH_SHORT).show()
        Toast.makeText(requireContext(), it, Toast.LENGTH_SHORT).show()
    }

    private fun observeSearchResults() = viewModel.searchReuslt.observe(viewLifecycleOwner) {
        recyclerView.layoutManager = GridLayoutManager(requireContext(), 2)
        val adapter = it?.let { MovieAdapter(it) }
        recyclerView.adapter = adapter
        adapter?.setOnItemClickListener(object : MovieAdapter.onItemClickListener {
            override fun onToggleClick(isFavorite: Boolean, item: Movies) {
                val movie = Movie(
                    movieName = item.original_title,
                    moviePoster = item.poster_path,
                    movieReleaseDate = item.release_date,
                    movieBanner = item.backdrop_path,
                    movieOverview = item.overview
                )
                if (isFavorite) favViewModel.removeMovie(movie) else favViewModel.insertMovie(movie)
            }

            override fun onItemClick(position: Int) {

                val movie = Movie(
                    movieName = it[position].original_title,
                    moviePoster = it[position].poster_path,
                    movieReleaseDate = it[position].release_date,
                    movieBanner = it[position].backdrop_path,
                    movieOverview = it[position].overview,
                    fav = it[position].fav
                )

                val action =
                    SearchMoviesFragmentDirections.actionSearchMoviesFragmentToMovieDetailFragment(
                        it[position].fav,
                        movie,
                        it[position].backdrop_path,
                        it[position].poster_path,
                        it[position].original_title,
                        it[position].release_date,
                        it[position].overview
                    )
                findNavController().navigate(action)
            }
        })
    }

    private fun setListenersForSearch() {

        val etSearchText = view?.findViewById<EditText>(R.id.et_movieSearch)

        etSearchText?.addTextChangedListener(object : TextWatcher {
            override fun afterTextChanged(s: Editable) {
                if (s.length > 3) {
                    viewModel.searchApiCall(s.toString())
                }
            }

            override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {

            }

            override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {
            }
        })
    }


}

MovieAdapter电影适配器

package com.example.moviemania.adapters

import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.ImageView
import android.widget.TextView
import androidx.recyclerview.widget.RecyclerView
import com.example.moviemania.extensions.GlideImageExtension.loadImage
import com.example.moviemania.models.Movies
import com.example.moviemania.R
import com.example.moviemania.databinding.MovieListBinding

class MovieAdapter(private val list: List<Movies>) :
    RecyclerView.Adapter<MovieAdapter.MyViewHolder>() {

    private lateinit var myListener: onItemClickListener


    interface onItemClickListener {
        fun onToggleClick(isFavorite: Boolean, item: Movies)
        fun onItemClick(position: Int)
    }

    fun setOnItemClickListener(listener: onItemClickListener) {
        myListener = listener
    }

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


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

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

    inner class MyViewHolder(private val binding: MovieListBinding, listener: onItemClickListener) :
        RecyclerView.ViewHolder(binding.root) {
        init {
            itemView.setOnClickListener {
                with(listener) { onItemClick(adapterPosition) }
            }
        }

        fun bind(item: Movies) {
            item.poster_path?.let { binding.ivMoviePoster.loadImage(it) }
            binding.tvMovieName.text = item.original_title
            binding.movieReleaseDate.text = item.release_date
            binding.favIcon.setImageResource(if (item.fav) R.drawable.redheart else R.drawable.redheart_border)
            binding.favIcon.setOnClickListener {
                myListener.onToggleClick(item.fav, item)
                item.fav = !item.fav
                notifyItemChanged(adapterPosition)
            }
        }
    }

}

I want that when the response result is available meaning that the searched movie does not exist the recyclerview should clear and the screen should be empty.我希望当响应结果可用意味着搜索到的电影不存在时,recyclerview 应该清除并且屏幕应该是空的。 Currently in this scenario it is displaying only the toast but the last successful search data still shows on screen.目前在这种情况下,它只显示吐司,但最后一次成功的搜索数据仍显示在屏幕上。 What i want is that data to be cleared from the recyclerview我想要的是从recyclerview中清除数据

when you have to Update RecyclerView on any action, add this to your adapter当您必须在任何操作上更新 RecyclerView 时,将其添加到您的适配器

public fun setData(private val newList: List<Movies>) {
      lists.clear();
      lists.addAll(newList);
      notifyDataSetChanged();
   }

Than call this method with new data from Activity/Fragment比使用来自 Activity/Fragment 的新数据调用此方法

adapter.updateData(viewModelsWithNewData );适配器.updateData(viewModelsWithNewData);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 “没有为“MyApp”类型定义方法“SplashScreen”。”。 我尝试了很多东西,但一无所获。 有什么解决办法吗? - "The method 'SplashScreen' isn't defined for the type 'MyApp'.". I have tried a lot of things and nothing. Any solution? 如何尝试在RecyclerView中检索值我尝试了很多,但是在Android中将数据库中的数据推送到Firebase后,它从Firebase的ID中检索了空值 - How to Retrieve Value in RecyclerView I tried a lot but it Retrieve a Null Value from Generated ID by Firebase after Push Data in Database in Android 如何将数据从 recyclerview click 传递到放置我的 recyclerview 的同一活动中的片段? - how can I pass data from recyclerview click to a fragment which is inside the same activity in which my recyclerview is placed? 无法启动守护进程。.我对此尝试了很多答案,但对我没有任何帮助...所以我决定全力以赴地要求它。 - Unable to start the daemon process.. i tried a lot of answers on that but nothing work for me…so i decide to ask it with full deails 我的问题是,如何将片段中从JSON获得的列表数据传递给活动? - My questions is, how do I pass the list data i have obtained from JSON in a fragment to an activity? 当我尝试清除所有数据时,应用程序已停止 - the application has stopped, when i tried to clear all data 如何清除recyclerView列表? - How can I clear the recyclerView list? 如何在我的 recyclerview 中使用 cardview 设置 onclick 侦听器,并在单击 recyclerview 时从 firebase 数据库中检索数据? - How can I set onclick listener in my recyclerview with cardview and retreive the data from firebase database when i click the recyclerview? 如何使用 AsyncTask、RecyclerView 和 RecyclerView.Adapter 将手机中的图像获取到 RecyclerView? - How can I use AsyncTask, RecyclerView, and a RecyclerView.Adapter to get images from my phone into my RecyclerView? 如何让我的 recyclerview 正确显示我从 Retrofit 收到的数据? - How can I make my recyclerview properly display the data I am receiving from Retrofit?
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM