Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何防止Recylerview在删除项目后再次显示Recylerview?_Android_Kotlin_Android Recyclerview_Android Livedata - Fatal编程技术网

Android 如何防止Recylerview在删除项目后再次显示Recylerview?

Android 如何防止Recylerview在删除项目后再次显示Recylerview?,android,kotlin,android-recyclerview,android-livedata,Android,Kotlin,Android Recyclerview,Android Livedata,我正在构建一个应用程序,用户可以在其中喜爱一些项目。我在一个片段中的recyclerview中展示了这一点。用户还可以通过单击“删除”按钮从收藏夹项目列表中删除该项目。我面临的问题是,如果用户删除了列表末尾的项,recylerview将从一开始重新加载并显示。我正在使用MVVM和Livedata。这是我的密码 FragmentFavorite.kt class FavoriteFragment :Fragment() { lateinit var favoriteViewModel:

我正在构建一个应用程序,用户可以在其中喜爱一些项目。我在一个片段中的recyclerview中展示了这一点。用户还可以通过单击“删除”按钮从收藏夹项目列表中删除该项目。我面临的问题是,如果用户删除了列表末尾的项,recylerview将从一开始重新加载并显示。我正在使用MVVM和Livedata。这是我的密码

FragmentFavorite.kt

class FavoriteFragment :Fragment() {


    lateinit var favoriteViewModel: FavoriteViewModel

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

    override fun onAttach(context: Context) {
        super.onAttach(context)

    }

    override fun onCreateView(

        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {

        val v=inflater.inflate(R.layout.fragment_favorite,container,false)

        favoriteViewModel=ViewModelProvider(requireActivity()).get(FavoriteViewModel::class.java)

        val recylerview=v.findViewById<RecyclerView>(R.id.recylerviewFav)
        recylerview.layoutManager=LinearLayoutManager(requireContext(),RecyclerView.VERTICAL,false)


        favoriteViewModel.getAll(requireContext()).observe(requireActivity(), Observer {

            val adapter=FavoriteAdapter(it,requireContext(),object:FavoriteDeleteListener{
                override fun OnFavDelete(id: Int) {
                    favoriteViewModel.deleteFav(requireContext(),id)

                }

            })
            recylerview.adapter=adapter

        })



        return v
    }


}
class FavoriteAdapter(val list:List<Favorite>,context: Context,val listener:FavoriteDeleteListener) :RecyclerView.Adapter<FavoriteAdapter.MyViewholder> (){


    val listofFav=list.reversed()
    class MyViewholder(itemview: View):RecyclerView.ViewHolder(itemview) {
        val textview_src=itemview.findViewById<TextView>(R.id.textview_src)
        val textView_tar=itemView.findViewById<TextView>(R.id.textview_tar)
        val delte_fav=itemview.findViewById<ImageView>(R.id.delete_fav)
    }

    override fun onCreateViewHolder(
        parent: ViewGroup,
        viewType: Int
    ): FavoriteAdapter.MyViewholder {
      val v=LayoutInflater.from(parent.context).inflate(R.layout.fav_list,parent,false)

        return MyViewholder(v)

    }

    override fun onBindViewHolder(holder: FavoriteAdapter.MyViewholder, position: Int) {

        holder.textView_tar.text=listofFav[position].translated_text
        holder.textview_src.text=listofFav[position].text_to_translate

        holder.delte_fav.setOnClickListener {
            listofFav[position].fid?.let { it1 -> delete(it1,listener)
                notifyItemRemoved(position)
                }

        }





    }

    override fun getItemCount(): Int {

        return listofFav.size

    }

    fun delete(id:Int,listene: FavoriteDeleteListener) {
        listene.OnFavDelete(id)
    }
}
类FavoriteFragment:Fragment(){
lateinit变量favoriteViewModel:favoriteViewModel
重写创建时的乐趣(savedInstanceState:Bundle?){
super.onCreate(savedInstanceState)
}
重写转速表(上下文:上下文){
super.onAttach(上下文)
}
覆盖创建视图(
充气机,
容器:视图组?,
savedInstanceState:捆绑?
):查看{
val v=充气机。充气(右布局。碎片,容器,假)
favoriteViewModel=ViewModelProvider(requirectivity()).get(favoriteViewModel::class.java)
val recylerview=v.findviewbyd(R.id.recylerviewFav)
recylerview.layoutManager=LinearLayoutManager(requireContext(),RecyclerView.VERTICAL,false)
favoriteViewModel.getAll(requireContext()).observe(requireContext()),Observer{
val adapter=FavoriteAdapter(它,requireContext(),对象:FavoriteDeleteListener{
覆盖OnFavDelete(id:Int){
favoriteViewModel.deleteFav(requireContext(),id)
}
})
recylerview.adapter=适配器
})
返回v
}
}
RecylerviewAdapter.kt

class FavoriteFragment :Fragment() {


    lateinit var favoriteViewModel: FavoriteViewModel

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

    override fun onAttach(context: Context) {
        super.onAttach(context)

    }

    override fun onCreateView(

        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {

        val v=inflater.inflate(R.layout.fragment_favorite,container,false)

        favoriteViewModel=ViewModelProvider(requireActivity()).get(FavoriteViewModel::class.java)

        val recylerview=v.findViewById<RecyclerView>(R.id.recylerviewFav)
        recylerview.layoutManager=LinearLayoutManager(requireContext(),RecyclerView.VERTICAL,false)


        favoriteViewModel.getAll(requireContext()).observe(requireActivity(), Observer {

            val adapter=FavoriteAdapter(it,requireContext(),object:FavoriteDeleteListener{
                override fun OnFavDelete(id: Int) {
                    favoriteViewModel.deleteFav(requireContext(),id)

                }

            })
            recylerview.adapter=adapter

        })



        return v
    }


}
class FavoriteAdapter(val list:List<Favorite>,context: Context,val listener:FavoriteDeleteListener) :RecyclerView.Adapter<FavoriteAdapter.MyViewholder> (){


    val listofFav=list.reversed()
    class MyViewholder(itemview: View):RecyclerView.ViewHolder(itemview) {
        val textview_src=itemview.findViewById<TextView>(R.id.textview_src)
        val textView_tar=itemView.findViewById<TextView>(R.id.textview_tar)
        val delte_fav=itemview.findViewById<ImageView>(R.id.delete_fav)
    }

    override fun onCreateViewHolder(
        parent: ViewGroup,
        viewType: Int
    ): FavoriteAdapter.MyViewholder {
      val v=LayoutInflater.from(parent.context).inflate(R.layout.fav_list,parent,false)

        return MyViewholder(v)

    }

    override fun onBindViewHolder(holder: FavoriteAdapter.MyViewholder, position: Int) {

        holder.textView_tar.text=listofFav[position].translated_text
        holder.textview_src.text=listofFav[position].text_to_translate

        holder.delte_fav.setOnClickListener {
            listofFav[position].fid?.let { it1 -> delete(it1,listener)
                notifyItemRemoved(position)
                }

        }





    }

    override fun getItemCount(): Int {

        return listofFav.size

    }

    fun delete(id:Int,listene: FavoriteDeleteListener) {
        listene.OnFavDelete(id)
    }
}
class-FavoriteAdapter(val-list:list,context:context,val-listener:FavoriteDeleteListener):RecyclerView.Adapter(){
val listofFav=list.reversed()
类MyViewholder(itemview:View):RecyclerView.ViewHolder(itemview){
val textview_src=itemview.findViewById(R.id.textview_src)
val textView_tar=itemView.findViewById(R.id.textView_tar)
val delte_fav=itemview.findviewbyd(R.id.delete_fav)
}
覆盖视图保持器(
父对象:视图组,
视图类型:Int
):FavoriteAdapter.MyViewholder{
val v=LayoutFlater.from(parent.context)。充气(R.layout.fav_列表,parent,false)
返回MyViewholder(v)
}
覆盖BindViewHolder(holder:FavoriteAdapter.MyViewholder,位置:Int){
holder.textView\u tar.text=listofFav[position]。已翻译的\u text
holder.textview\u src.text=listofFav[position]。text\u到\u翻译
holder.delte_fav.setOnClickListener{
listofFav[position].fid?.let{it1->删除(it1,侦听器)
已删除的项目(位置)
}
}
}
重写getItemCount():Int{
返回listofFav.size
}
趣味删除(id:Int,listene:FavoriteDeleteListener){
listene.OnFavDelete(id)
}
}

我怀疑问题出在这里:

favoriteViewModel.getAll(requireContext()).observe(requireActivity(), Observer {
    val adapter=...
    recylerview.adapter=adapter
})
如果从数据集中删除某个项目会导致观察者发出新的数据集,这将导致重新分配
RecyclerView
的适配器,从而完全重置视图位置


您可以使用来计算列表之间的差异,而不是每次都完全覆盖适配器。

这个答案应该可以解决您的问题-什么是
favoriteViewModel.deleteFav()
do?@BenP它从房间数据库中删除项目