Мне нужно сделать горизонтальный скроллер, где каждый 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 больше не квадрат и, конечно, не вдвое меньше ширины экрана. Любой отзыв?
Спасибо! Это помогло мне! Вот что я сделал: 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
Используйте MeasureSpec. ТОЧНО, а не AT_MOST, потому что вы хотите, чтобы эта высота была точно. Кроме того, вместо этого вы гораздо лучше устанавливаете их в onCreateViewHolder и используете RecyclerView.LayoutParams. Извините, я должен был упомянуть об этом в первом ответе. В этом случае вам не нужно переопределять onMeasure, и вам не нужно создавать спецификации измерений. – yigit
Отлично! Это намного проще. Благодаря! – Tef