2016-09-09 6 views
0

Я работаю над фрагментом кода, который позволяет пользователю выбрать одну из своих фотографий из Facebook и использовать ее в нашем приложении в качестве профиля. Логика выполнена, но макет дает мне немного головную боль.Как установить динамический размер заполнителя в recyclerview с gridlayout?

У меня есть этот макет для моих изображений

<?xml version="1.0" encoding="utf-8"?> 
<android.support.v7.widget.CardView 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:card_view="http://schemas.android.com/apk/res-auto" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:layout_gravity="center" 
    android:layout_margin="5dp" 
    > 
    <ImageView 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:id="@+id/imageView" 
     /> 
</android.support.v7.widget.CardView> 

и я использую RecyclerView, который загружает каждое изображение альбома в сетку 2 колонки (любезно GridLayoutManager). Это делается с помощью Пикассо:

mImageLoader.load(image.getUrl()).resize(480, 480).centerCrop().into(holder.imageView); 

Поскольку нагружать альбом, который содержит сотни фотографий может занять некоторое время, я хочу, чтобы отобразить заполнитель. Этого можно добиться с помощью оператора .placeholder в Picasso.

Моя проблема заключается в том, что я понятия не имею, насколько высокий и широкий из моих ViewHolders.

GridLayoutManager вычислит, сколько места доступно и присвоить значение ширины каждому элементу, так что многие, как я назначил, подойдут, что является причиной, почему я не могу использовать предопределенный drawable для моего заполнителя, потому что я никогда не может быть уверенным, что мой 240x240 drawable будет соответствовать каждому устройству.


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

ответ

0

Хотя это не совсем ответ на вопрос, мне действительно нужен был ImageView, который всегда был квадратным. Таким образом, я могу просто загрузить все, что захочу, в эту вещь и изменить ее размер, чтобы соответствовать Picasso.

mImageLoader.load(image.getUrl()).fit().into(holder.imageView);

Для того, чтобы достичь этого, я подклассы ImageView и в методе onMeasure, я присвоить значение ширины к представлению о высоте-параметра.

public class SquareImageView extends ImageView { 

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

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

Потому что неплохо было бы просто определить его как вид-параметр, мы реализуем, допускающее применение стиля декларирования в нашем attr файле

<declare-styleable name="SquareImageView"> 
    <attr name="dominantSide" format="enum"> 
     <enum name="width" value="0"/> 
     <enum name="height" value="1"/> 
    </attr> 
</declare-styleable> 

Теперь мы можем просто добавить его в наш SquareImageView

<com.example.android.ui.custom.SquareImageView 
    android:layout_width="match_parent" 
    android:layout_height="0dp" 
    app:dominantSide="width" /> 

Поскольку мы заявили, что наша доминирующая сторона - это width, мы можем делать все, что мы хотим, с высотой.Вы можете назначить его как 0dp, как match_parent, как 3.14159dp или что-то еще, что вы хотите. Вам нужно что-то присваивать, иначе IntelliJ выговорит вас.

В нашем пользовательском классе, мы просто получаем параметр dominantSide

public class SquareImageView extends ImageView { 

    private int dominantSide; 

    public SquareImageView(Context context, AttributeSet attrs) { 
     super(context, attrs); 

     TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.SquareImageView); 
     dominantSide = a.getInt(R.styleable.SquareImageView_dominantSide, 0); 
     a.recycle(); 
    } 

    @Override 
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 
     super.onMeasure(widthMeasureSpec, heightMeasureSpec); 
     int edgeLen = dominantSide == 0 ? getMeasuredWidth() : getMeasuredHeight(); 
     setMeasuredDimension(edgeLen, edgeLen); 
    } 
} 
0

Вам нужно динамически добавить менеджер компоновки, где вы должны пройти макет сетки во время выполнения с числом столбцов ..

Как это

RecyclerView.LayoutManager LayoutManager = новый GridLayoutManager (getApplicationContext(), 2); recyclerView.setLayoutManager (layoutManager);

+0

Это не то, что я просил. Я уже упоминал, что я использую GridLayoutManager. Я хочу, чтобы ширина каждого элемента в адаптере, поэтому я могу сгенерировать растровое изображение заполнителя – TormundThunderfist

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

  • Нет связанных вопросов^_^