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);
            }
        });
    }
Другие вопросы по тегам