方案一(推荐)
- 对itemView设置layoutParams属性来动态调整,需要获取屏幕的宽度,减去padding和margin,然后除以每一行item数量,得到每个item的实际宽度,然后根据比例计算出高度
class PreferSubAdapter : BaseQuickAdapter<PreferItem, BaseViewHolder>(R.layout.item_recycle_prefer_sub) {
override fun convert(holder: BaseViewHolder, item: PreferItem) {
val ivBg = holder.getView<ImageView>(R.id.iv_bg)
val tvTitle = holder.getView<TextView>(R.id.tv_title)
val width = (mContext.screenWidth - 56.px) / 3
val height = width * 6 / 11
holder.itemView.layoutParams.let {
lp ->
lp.width = width.toInt()
lp.height = height.toInt()
holder.itemView.layoutParams = lp
}
Glide.with(mContext).load(item.img_url).centerCrop().into(ivBg)
if (item.desc.isNotEmpty()){
val span = SpannableString(item.name + "\n" + item.desc)
span.setSpan(StyleSpan(Typeface.NORMAL), item.name.length, span.length, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
span.setSpan(AbsoluteSizeSpan(10, true), item.name.length, span.length, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
tvTitle.text = span
}else{
tvTitle.text = item.name
}
}
}
方案二
- 通过自定义View的setMeasuredDimension来限定好View的比例
- 特点:优雅,但是对于不同的recyclerView的item需要重新写一个对应的自定义View
import android.content.Context
import android.util.AttributeSet
import androidx.appcompat.widget.AppCompatImageView
class PreferImageView @JvmOverloads constructor(context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0) : AppCompatImageView(context, attrs, defStyleAttr) {
init {
initView()
}
private fun initView() {
}
override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec)
val width = MeasureSpec.getSize(widthMeasureSpec)
setMeasuredDimension(width, width * 6 / 11)
}
}