После более чем недели настойчивых попыток я придумал элегантное решение:
В XML я использовал привязку данных:
<data>
<variable
name="shape"
type="chat.rocket.android.helper.Constants"/>
</data>
...
<com.facebook.drawee.view.SimpleDraweeView
android:id="@+id/image_avatar"
android:layout_width="40dp"
android:layout_height="40dp"
app:roundedCornerRadius='@{shape.AVATAR_SHAPE_CIRCLE ? @dimen/circle_avatar_corner_radius : @dimen/square_avatar_corner_radius}' />
Поскольку roundedCornerRadius
не имеет соответствующего setRoundedCornerRadiusIn BindingAdapters.kt
,
@BindingAdapter("roundedCornerRadius")
fun setRoundedCornerRadius(view: SimpleDraweeView, height: Float) {
val roundingParams = RoundingParams.fromCornersRadius(height)
view.hierarchy.roundingParams = roundingParams
}
Файл Constants.kt
имеет константу, которую можно настроить для изменения формы:
object Constants {
...
const val AVATAR_SHAPE_CIRCLE = true
}
В RecyclerViewAdapter
,
...
val layoutInflater = LayoutInflater.from(parent.context)
val binding: ViewDataBinding = DataBindingUtil.inflate(layoutInflater, R.layout.item_contact, parent, false)
ContactViewHolder(binding.root)
...
Это лучшее решение, которое я мог придумать. Было бы здорово, если бы есть возможность применить несколько атрибутов в зависимости от значения shape.AVATAR_SHAPE_CIRCLE
. Например.
if(shape.AVATAR_SHAPE_CIRCLE)
apply these attr
else
apply these attr
Предложения приветствуются!