2015-04-06 4 views
0

Мне нужно сделать горизонтальный скроллер, где каждый ViewHolder имеет тот же размер, но размер его составляет половину экрана. Позвольте мне показать вам, что я сделал: http://i.stack.imgur.com/aru4S.pngAndroid: список, который прокручивается по горизонтали с одной строкой и двумя столбцами

Красный квадрат представляет собой изображение, синий один текстовый. Как вы можете видеть ViewHolder здесь квадратный, но размер фиксирован и 150dp благодаря этому коду:

public class SquareRelativeLayout extends RelativeLayout { 

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

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

public SquareRelativeLayout(Context context, AttributeSet attrs, int defStyleAttr) { 
    super(context, attrs, defStyleAttr); 
} 

@Override 
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 
    // Set a square layout. 

    super.onMeasure(heightMeasureSpec, heightMeasureSpec); 
} 
} 

XML-на ViewHolder из adaptern в RecyclerView существа

 <listadoProgramas.SquareRelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:listSelector="@color/fondo_contenido"> 
<io.leocad.view.WebCachedImageView 
     android:id="@+id/imagen" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:scaleType="centerCrop" 
     android:adjustViewBounds="true"/> 
<TextView 
     android:id="@+id/titulo" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:paddingLeft="10dp" 
     android:paddingRight="10dp" 
     android:paddingTop="10dp" 
     android:paddingBottom="10dp" 
     android:layout_gravity="bottom" 
     android:textColor="@color/blanco" 
     android:background="@color/color_fondo_texto_imagen" 
     android:singleLine="true" 
     android:layout_alignParentBottom="true" 
     /> 
     </listadoProgramas.SquareRelativeLayout> 

Я пробовал установив на на следующие измерения:

protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 
    // Set a square layout. 
    DisplayMetrics displaymetrics = new DisplayMetrics(); 
    ((Activity) getContext()).getWindowManager().getDefaultDisplay().getMetrics(displaymetrics); 
    int widthScreen = displaymetrics.widthPixels; 
    int width = widthScreen/2; 
    this.setMeasuredDimension(width, width); 
    super.onMeasure(width, width); 
} 

И результат состоит в следующем: http://i.stack.imgur.com/re5Xf.png Теперь ViewHolder больше не квадрат и, конечно, не вдвое меньше ширины экрана. Любой отзыв?

ответ

0

Вы вызываете super.onMeasure(width, width);, который вызывает супер с некоторыми параметрами измерения мусора, и он установит новые измеренные измерения, переопределяя ваши.

Вместо этого, либо не вызывайте супер, либо вызывайте супер с соответствующими параметрами измерения, полученными от MeasureSpec.makeMeasureSpec.

+0

Спасибо! Это помогло мне! Вот что я сделал: protected void onMeasure (int widthMeasureSpec, int heightMeasureSpec) { ... int widthScreen = displaymetrics.widthPixels; int newWidthMeasureSpec = MeasureSpec.makeMeasureSpec (widthScreen/2, MeasureSpec.AT_MOST); this.setMeasuredDimension (newWidthMeasureSpec, newWidthMeasureSpec); super.onMeasure (newWidthMeasureSpec, newWidthMeasureSpec); } – Tef

+0

Используйте MeasureSpec. ТОЧНО, а не AT_MOST, потому что вы хотите, чтобы эта высота была точно. Кроме того, вместо этого вы гораздо лучше устанавливаете их в onCreateViewHolder и используете RecyclerView.LayoutParams. Извините, я должен был упомянуть об этом в первом ответе. В этом случае вам не нужно переопределять onMeasure, и вам не нужно создавать спецификации измерений. – yigit

+0

Отлично! Это намного проще. Благодаря! – Tef

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