2016-10-05 71 views
0

我遇到了一個奇怪的問題,RecyclerView動態地使用Glide加載圖像。貌似競爭狀態,我看着這個線程,但它並沒有解決這個問題:RecyclerView和Glide搞亂佈局

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

這是它看起來像截圖和紅色箭頭顯示的圖像毛刺,注意到用戶名文本始終存在。

enter image description here

代碼本身看起來非常直截了當:

RV適配器:

@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" 

但現在的問題變成,爲什麼?我不知道。