RecyclerView + StaggeredGridLayout + Picasso получить ширину GridItem
М использую RecyclerView
с StaggeredGrid
(spanCount является переменной). Каждый GridItem (CardView
) содержит квадрат ImageView. То, что я хочу, это загрузить изображение из моего бэкэнда с желаемой шириной и высотой, чтобы точно соответствовать ImageView внутри CardView. Любые предложения, которые я могу достичь этого? Пример кода ниже:
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, final int position) {
Picasso.with(context)
.load(String.format("http://mybackend.com/image/w_%d,h_%d/%s",
holder.image.getMeasuredWidth(), // This returns 0, but i want here a real width
holder.image.getMeasuredWidth(),
myCollection.get(position).getImagePid()))
.tag(context)
.placeholder(R.drawable.placeholder_logo)
.into(holder.image);
В двух словах: каким-то образом мне нужно получить размеры (ширину) imageView, прежде чем мой ViewHolder будет привязан.
2 ответа
Вы изучали использование.fit()? Я считаю, что изменит размер изображения, чтобы точно соответствовать ImageView.
Вы можете использовать ViewTreeObserver:
final int width = holder.image.getMeasuredWidth();
if (width > 0) {
Picasso.with(context)
.load(String.format("http://mybackend.com/image/w_%d,h_%d/%s",
holder.image.getMeasuredWidth(), // This returns 0, but i want here a real width
holder.image.getMeasuredWidth(),
myCollection.get(position).getImagePid()))
.tag(context)
.placeholder(R.drawable.placeholder_logo)
.into(holder.image);
} else {
holder.image.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
holder.image.getViewTreeObserver().removeGlobalOnLayoutListener(this);
Picasso.with(context)
.load(String.format("http://mybackend.com/image/w_%d,h_%d/%s",
holder.image.getMeasuredWidth(), // This returns 0, but i want here a real width
holder.image.getMeasuredWidth(),
myCollection.get(position).getImagePid()))
.tag(context)
.placeholder(R.drawable.placeholder_logo)
.into(holder.image);
}
});
}