0
我遇到了一個奇怪的問題,RecyclerView動態地使用Glide加載圖像。貌似競爭狀態,我看着這個線程,但它並沒有解決這個問題:RecyclerView和Glide搞亂佈局
Recyclerview Adapter and Glide - same image every 4-5 rows
這是它看起來像截圖和紅色箭頭顯示的圖像毛刺,注意到用戶名文本始終存在。
代碼本身看起來非常直截了當:
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; }
}
如果任何人都可以當場比賽狀態,我真的很感激。
謝謝!