尝试隐藏具有空属性的卡片时,如何消除 recyclerView 中的空白?

Posted

技术标签:

【中文标题】尝试隐藏具有空属性的卡片时,如何消除 recyclerView 中的空白?【英文标题】:How can i eliminate Empty spaces in recyclerView when trying to hide cards with null properties? 【发布时间】:2021-10-14 02:12:09 【问题描述】:

尝试隐藏具有空属性的卡片时,recyclerView 中的空格

嗨,我是新来的。所以这是我的第一个问题。我正在尝试将 google Books API 用于一项任务,当我实现所有内容时,我看到许多没有图片、标题或作者的书籍, 出于显而易见的原因,我不希望它们出现在应用程序的搜索中。我试图将属性card.visibility = View.GONE(在try-catch块内)应用于recyclerview中的那些cardview,但是这样做时它们会在recycler列表中留下空白,我不希望它们出现。 你怎么能解决这个问题?我附上部分代码和图像,以便您可以看到我这样做时剩余的空间

   override fun onBindViewHolder(holder: LibrosHolder, position: Int) 
        holder.binding.apply 

            var autores = libros.items[position].volumeInfo.authors
            tvtitulo.text = libros.items[position].volumeInfo.title

            try 
                Glide.with(ivlibro.context)
                    .load(libros.items.get(position).volumeInfo.imageLinks.thumbnail)
                    .fitCenter()
                    .into(ivlibro)
                tvautor.text = autores[0]
                tvtitulo.text = libros.items[position].volumeInfo.title
             catch (e: NullPointerException) 
                tarjeta.isVisible=true
                tarjeta.visibility = View.GONE
                ivlibro.setImageResource(R.mipmap.noimagendisponible)
                tvautor.text = "Sin autor"
                tvtitulo.text = "Sin título"
            
        
    

这就是应用在没有“visibility = View.GONE”属性的情况下的工作方式

This is how the app works without the "GONE" atribute

这是激活了“visibility = View.GONE”属性

And this is with "visibility = View.GONE" attribute activated

如您所见,cardViews 之间有很多空白空间,我该如何消除? (英语不是我的第一个 lenguaje,很抱歉,如果这很难阅读,我表示歉意)

【问题讨论】:

`tarjeta` 是指父布局吗? catch (e: NullPointerException)hahahaha ...你为什么不先检查一些东西是否为空? 我认为在这种情况下父布局是recyclerView,而“tarjeta”是recyclerView中的每个cardView 【参考方案1】:

您需要在 onBindViewHolder 之前从 libros.items 中删除空数据。因为在你的 try catch 中,item 会被忽略

【讨论】:

【参考方案2】:

有很多方法可以做你想做的事(折叠列表中的项目),但老实说,在尝试显示之前从列表中过滤掉无效数据会更容易。

类似:

// get all your books from the API, however you do that
val todosLibros = getAllTheBooks()

// filter out the bad data
val buenosLibros = todosLibros
        .filterNotNull  it.autores 
        .filterNotNull  it.tvtitulo 
        .filterNotNull  it.volumeInfo?.imageLinks?.thumbnail 

// set the filtered data on your RecyclerView's adapter
// (I'm guessing you pass it in through the constructor)
recyclerView.adapter = MyCoolBooksAdapter(buenosLibros)

这样,您就不会弄乱您需要忽略的项目,您无需检查内容是否有效 - 您在将其传递给适配器之前已经检查过它!所有数据都很好,现在只是一个普通的项目列表

【讨论】:

以上是关于尝试隐藏具有空属性的卡片时,如何消除 recyclerView 中的空白?的主要内容,如果未能解决你的问题,请参考以下文章

在使用 Recycler View 时尝试在空对象引用上调用虚拟方法

在Recycler视图上添加图像视图时,Android导航抽屉动画滞后/减速

Recycler视图在android studio中未显示一张卡片视图

从用户定义的函数中消除空查询结果

解构后如何返回空值?

消除sql select中的特定空值