2016-10-05 8 views
0

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

Recyclerview Adapter and Glide - same image every 4-5 rows

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

enter image description here

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

RV Adapter:

@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; } 
} 

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

спасибо!

ответ

0

Исправить было установление ширины и высоты значка на фиксированное значение, поэтому вместо «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" 

Но вопрос теперь становится почему? Понятия не имею.

Смежные вопросы