当前位置: 首页 > 知识库问答 >
问题:

动态修改RecyclerView中的列数以及图像的大小

甄佐
2023-03-14

我已经能够使用GridLayout动态地更改RecyclerView中的列数2-1,但另外我需要更改高度,以便当它是1列时,图像大小大于2列行中的图像大小。

我已经看到,通过StaggedGridLayoutManager,我可以调整大小,但我不知道如何做到这两个。

val gridLayoutManager=gridLayoutManager(requireContext(),2)

    binding.recycler.layoutManager=gridLayoutManager

    gridLayoutManager.spanSizeLookup=object:GridLayoutManager.SpanSizeLookup(){
        override fun getSpanSize(position: Int): Int {
            return if((position+1)%3==0){
                2

            }else{
                1

            }
        }


 Glide.with(binding.root)
        .asBitmap()
        .load(bindObject.image)
        .apply(RequestOptions().centerCrop())
        .apply(

            RequestOptions()
                .override(160, 160))

        .into(binding.image!!)
}

类HomeAdapter(私有val项:可变列表,val视图模型:HomeViewModel):GlobalAdapter(项){override fun onCreateViewHolder(父级:ViewGroup,viewType:Int):GlobalViewHolder{val inflater=LayoutFlater.from(父级.上下文)

    return HomeViewHolder(DataBindingUtil.inflate(inflater, R.layout.item_news2, parent, false),
        viewModel)
}

override fun onBindViewHolder(holder: GlobalViewHolder<News>, position: Int) {
    holder.bind(items[position])
}

fun addItems(items: List<News>?) {
    if (items != null) {
        this.items.addAll(items)
        notifyDataSetChanged()
    }
}

}

共有1个答案

田修为
2023-03-14

您可以定义多个视图类型

<?xml version="1.0" encoding="utf-8"?>
<ImageView
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/imageViewSmall"
    android:layout_width="match_parent"
    android:layout_height="100dp" <!-- Smaller size -->
    />

item_large

<?xml version="1.0" encoding="utf-8"?>
<ImageView
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/imageViewLarge"
    android:layout_width="match_parent"
    android:layout_height="250dp" <!-- Bigger size -->
    />

然后,您可以使用getItemViewType方法来定义应根据您的条件显示的视图类型((位置1)%3==0):

private const val ITEM_VIEW_TYPE_SMALL = 0
private const val ITEM_VIEW_TYPE_LARGE = 1

class HomeAdapter(
    private val items: MutableList, 
    val viewModel: HomeViewModel
): RecyclerView.Adapter<RecyclerView.ViewHolder>() { 

    override fun getItemViewType(position: Int): Int = if ((position+1) % 3 == 0) {
        // 2 column item, return the small image
        ITEM_VIEW_TYPE_SMALL
    } else {
        // 1 column item, return the large image
        ITEM_VIEW_TYPE_LARGE
    }
    
    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { 
        val inflater = LayoutInflater.from(parent.context)
        if (viewType == ITEM_VIEW_TYPE_SMALL) return SmallViewHolder(ItemSmallBinding.inflate(inflater, parent, false))
        return LargeViewHolder(ItemLargeBinding.inflate(inflater, parent, false))
    }

    override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
        holder.bind(...) // Pass the image url here
    }

    fun addItems(items: List<News>?) {
        if (items != null) {
            this.items.addAll(items)
            notifyDataSetChanged()
        }
    }

    // Small image view holder
    class SmallViewHolder(private val binding: ItemSmallBinding) : RecyclerView.ViewHolder(binding.root) {
        fun bind(image: String) {
            // Set the image in imageViewSmall
        }
    }

    // Large image view holder
    class LargeViewHolder(private val binding: ItemLargeBinding) : RecyclerView.ViewHolder(binding.root) {
        fun bind(image: String) {
            // Set the image in imageViewLarge
        }
    }
}
 类似资料:
  • 本文向大家介绍vue favicon设置以及动态修改favicon的方法,包括了vue favicon设置以及动态修改favicon的方法的使用技巧和注意事项,需要的朋友参考一下 最近写公司项目时,动态更新favicon 动态更新之前需要有一个默认的favicon。 目前vue-cli搭建的vue项目里面已经有了一个static文件夹,存放静态文件。 favicon图片放到该文件夹下。 然后再in

  • 问题内容: 我目前正在尝试在我的网站上制作一个图像地图,该图像地图会根据窗口的大小进行调整…我想知道是否可以通过HTML来执行此操作,还是必须使用Javascript或其他方式来执行此操作?语言。 问题答案: 如果最终使用JavaScript完成任务,则可以使用以下跨浏览器代码段来调整元素中所有区域的大小。 必须等于原始图像的宽度。您还需要在HTML中使用一些相对单位:

  • 我已经将一个图像读入一个JLabel,并将该图像缩放到JLabel的大小,如下所示: 我使用提供的GroupLayout并将水平轴和垂直轴设置为“自动调整大小”(通过设计视图),这样每当我更改窗口大小时,JLabel的大小就会自动调整为JFrame的大小。 现在我想调整图像的大小和JLabel的大小,这里开始麻烦了。我添加了一个事件处理程序,它响应JFrame的大小调整,如下所示: 另外,如果我想

  • 我怎么在move的时候让对应的样式也修改,也就是elRed.style或elGreen.style,现在不起作用。 可以跳转到这里直接看效果: https://play.vuejs.org/#eNqlVW1r2zAQ/is3U4gDmdPto5eWbnSMwcZg7...

  • 问题内容: 我有一个需要修改数据库表中列默认值的要求。该表已经是数据库中的现有表,并且当前该列的默认值为NULL。现在,如果将新的默认值添加到此列,如果我是正确的话,它将列的所有现有NULL更新为新的DEfault值。有没有一种方法可以不执行此操作,但仍在列上设置新的默认值。我的意思是我不想更新现有的NULL,并希望它们保留为NULL。 在这方面的任何帮助,不胜感激。谢谢 问题答案: 您对将会发生

  • 问题内容: 如本问题所述(将图像包装到Jframe中),我需要一个jframe来匹配提供的确切图像(图像本身最初是已转换为图像的PDF) 所提供的解决方案确实为我的图像尺寸构建了一个jframe,但实际上看不到所有图像。我需要能够调整jframe的大小,并使图像动态调整为新的jframe大小。失败的话,我想如果我可以滚动jframe或什至放大或缩小,至少可以到达当前无法看到的图像部分。 我需要这个