RecyclerView и Glide испортили макет

У меня возникла странная проблема с динамической загрузкой изображений RecyclerView с помощью Glide. Похоже на состояние гонки, и я просмотрел эту тему, но это не решило проблему:

Адаптер Recyclerview и Glide - одно и то же изображение каждые 4-5 строк

Вот как это выглядит на снимке экрана, и красные стрелки показывают сбой изображения, обратите внимание, что текст имени пользователя существует ВСЕГДА.

введите здесь описание изображения

Сам код выглядит довольно прямолинейно:

Адаптер РВ:

@Override
public void onBindViewHolder(RecyclerView.ViewHolder viewHolder, int position) {
    int viewType = getItemViewType(position);
    bindSubscribersCell((SubscribersListViewHolder) viewHolder, position);
}

обязательный вид:

private void bindSubscribersCell(SubscribersListViewHolder holder, int position) {
    SubscribersListRowTypeUser subscriberRow = (SubscribersListRowTypeUser) mItems.get(position);
    String userFullName = SDKUserHelper.MakeFullName(subscriberRow.getUser());
    holder.getUsername().setText(userFullName);
    holder.getUsername().setVisibility(View.VISIBLE);

    CircleImageView userImageView = holder.getAvatarImage();
    Drawable defaultIcon = ContextCompat.getDrawable(
            userImageView.getContext(),
            R.drawable.avatar_guest);
    RecylerViewHelper.loadImageView(
            subscriberRow.getUser().getPhotoUrl(),
            userImageView,
            defaultIcon,
            true);
}

помощник загрузки изображений, используя ту же технику, что описана в теме, о которой я упоминал выше:

public static void loadImageView(
        String imageUrl,
        ImageView imageView,
        Drawable drawable,
        boolean icon) {
    Context context = imageView.getContext();
    if (imageUrl != null && !imageUrl.isEmpty()) {
        if (icon) {
            Glide.with(context).using(CloudinaryHelper.getUrlLoaderPresetPOIIcon(context)).
                    load(imageUrl).
                    centerCrop().
                    crossFade().
                    into(imageView);
        } else {
            Glide.with(context).
                    load(imageUrl).
                    crossFade().
                    into(imageView);
        }
    } else {
        Glide.clear(imageView);
        imageView.setImageDrawable(drawable);
    }
}

внутренняя планировка ячейки:

<RelativeLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_gravity="center_vertical">

    <de.hdodenhof.circleimageview.CircleImageView
        android:id="@+id/user_avatar"
        android:layout_width="wrap_content"
        android:layout_height="@dimen/splash_icon_height"
        android:layout_centerVertical="true"
        android:src="@drawable/avatar_guest" />

    <TextView
        android:id="@+id/user_name"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerVertical="true"
        android:layout_marginEnd="40dp"
        android:layout_toEndOf="@+id/user_avatar"
        android:ellipsize="end"
        android:gravity="center"
        android:visibility="gone"
        android:maxLines="1"
        android:text=""
        android:textSize="14sp" />

    <ImageView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentEnd="true"
        android:layout_centerVertical="true"
        android:layout_marginEnd="20dp"
        android:src="@drawable/arrow_forward_gray" />

</RelativeLayout>

класс-оболочка для получения элементов управления макетом:

public class SubscribersListViewHolder extends RecyclerView.ViewHolder {
    final private CircleImageView mAvatarImage;
    final private TextView mUsername;
    final private View mViewHolder;

    public SubscribersListViewHolder(View itemView) {
        super(itemView);
        mViewHolder = itemView;
        mUsername = (TextView) itemView.findViewById(R.id.user_name);
        assert mUsername != null;
        mAvatarImage = (CircleImageView) itemView.findViewById(R.id.user_avatar);
        assert mAvatarImage != null;
    }

    public TextView getUsername() { return mUsername; }
    public CircleImageView getAvatarImage() { return mAvatarImage; }
    public View getViewHolder() { return mViewHolder; }
}

Если кто-то может определить состояние гонки, я очень ценю.

спасибо!


person gmmo    schedule 05.10.2016    source источник


Ответы (1)


Исправление состояло в том, чтобы установить ширину и высоту значка на фиксированное значение, поэтому вместо «wrap_content» сделайте фиксированное значение dp (в моем случае 49dp). Другими словами:

НЕПРАВИЛЬНО (состояние гонки)

android:layout_width="wrap_content"
android:layout_height="@dimen/splash_icon_height"

ПРАВИЛЬНЫЙ:

android:layout_width="@dimen/splash_icon_height"
android:layout_height="@dimen/splash_icon_height"

Но теперь возникает вопрос, почему? Я понятия не имею.

person gmmo    schedule 18.10.2016