0

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

+0

Если между столбцами существует большой разрыв, вы также должны предоставить «scaleType» своим изображениям, я бы предложил установить либо centerCrop, либо fitXY scaleType. – Apurva

+0

, дающее любое изображение + код вашей работы, будет более поддающимся – Sayem

+0

Вы можете посмотреть на это, где вы можете использовать глиссирование с помощью [Glide/Picasso-RecyclerView-StaggeredGridLayoutManager] (https://github.com/yuvaraj119/Picasso- RecyclerView-StaggeredGridLayoutManager) – YLS

ответ

0

Наконец я смог выяснить soultion. Мне пришлось создать пользовательское изображение, чтобы изменить его соотношение сторон в Staggered Recycler View.

public class DynamicHeightNetworkImageView extends ImageView { 
private float mAspectRatio = 1.5f; 

public DynamicHeightNetworkImageView(Context context) { 
    super(context); 
} 

public DynamicHeightNetworkImageView(Context context, AttributeSet attrs) { 
    super(context, attrs); 
} 

public DynamicHeightNetworkImageView(Context context, AttributeSet attrs, int defStyle) { 
    super(context, attrs, defStyle); 
} 

public void setAspectRatio(float aspectRatio) { 
    mAspectRatio = aspectRatio; 
    requestLayout(); 
} 

@Override 
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 
    super.onMeasure(widthMeasureSpec, heightMeasureSpec); 
    int measuredWidth = getMeasuredWidth(); 
    setMeasuredDimension(measuredWidth, (int) (measuredWidth/mAspectRatio)); 
} 
} 

Затем в onBindViewHolder адаптера я установить соотношение сторон изображения с помощью -

Picasso.with(this).load(THUMB_URL).into(holder.thumbnailView); 
holder.thumbnailView.setAspectRatio(ASPECT_RATIO)); 
0

Первый Ваш RecyclerView инициализировать

RecyclerView recyclerGallery = (RecyclerView)findViewById(R.id.gallery_recycler_view); 
gaggeredGridLayoutManager = new StaggeredGridLayoutManager(3, 1); 
recyclerGallery.setLayoutManager(gaggeredGridLayoutManager); 
galleryAdapter = new GalleryAdaptor(ProfImageGallery.this, imgsUrl); 
recyclerGallery.setAdapter(galleryAdapter); 

Тогда Ваш адаптер (Edit соответствии с вашими потребностями)

public class GalleryAdaptor extends RecyclerView.Adapter<GalleryAdaptor.ViewHolder> { 

     private Context mContext; 
     private ArrayList<String> mDataset; 


    // Provide a suitable constructor (depends on the kind of dataset) 
     public GalleryAdaptor(Context mContext, ArrayList<String> mdataList) { 
       this.mContext = mContext; 
       this.mDataset = mdataList; 
     } 

     // Create new views (invoked by the layout manager) 
     @Override 
     public GalleryAdaptor.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 

       // create a new view 
       View v = LayoutInflater.from(parent.getContext()) 
          .inflate(R.layout.row_gallery, parent, false); 

       // set the view's size, margins, paddings and layout parameters 
       ViewHolder vh = new ViewHolder(v); 
       return vh; 
     } 

     // Replace the contents of a view (invoked by the layout manager) 
     @Override 
     public void onBindViewHolder(final ViewHolder holder, final int position) { 
       // - get element from your dataset at this position 
       // - replace the contents of the view with that element 


       String imageUrl = mDataset.get(position); 

       holder.progressBar.setVisibility(View.VISIBLE); 

       //load the image url with a callback to a callback method/class 

       Picasso.with(mContext) 
        .load(imageUrl) 
        .into(holder.workImage, 
          new ImageLoadedCallback(holder.progressBar) { 
           @Override 
           public void onSuccess() { 
             if (holder.progressBar != null) { 
              holder.progressBar.setVisibility(View.GONE); 
             } 
           } 
          }); 
     } 

Заменить Picaso код т.е.

Picasso.with(mContext) 
     .load(imageUrl) 
     .into(holder.workImage, 
       new ImageLoadedCallback(holder.progressBar) { 
        @Override 
        public void onSuccess() { 
          if (holder.progressBar != null) { 
           holder.progressBar.setVisibility(View.GONE); 
          } 
        } 
       }); 

С Glide.

Glide.with(this).load(imageUrl).into(imageView); 
+0

Что такое макет для R.layout.row_gallery? – Passiondroid

+0

это строка для вашего макета, используемого в ресайклере –

4

у меня был тот же вопрос. Для меня работала установка android:adjustViewBounds="true" для моего ImageView. Я даже не устанавливаю scaleType.

Вот полное содержание моего файла макета item.xml.

<?xml version="1.0" encoding="utf-8"?> 
<ImageView 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/gif_image" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:background="@color/colorFiller" 
    android:adjustViewBounds="true"/> 

Надеюсь, это поможет!

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