我正在创建与instagram非常相似的布局
我想在3列的recycleview中向用户展示媒体
这是我的卡:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="100dp"
android:layout_gravity="center"
android:layout_margin="1dp">
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/mediaThumbnail"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/link_blue"
android:scaleType="centerCrop" />
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/likes"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignLeft="@id/mediaThumbnail"
android:layout_alignBottom="@id/mediaThumbnail"
android:layout_margin="2dp"
android:drawableLeft="@drawable/ic_like"
android:text="10001"
android:textAlignment="center"
android:textColor="#000000"
android:textSize="12sp" />
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/comments"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignRight="@id/mediaThumbnail"
android:layout_alignBottom="@id/mediaThumbnail"
android:layout_margin="2dp"
android:drawableLeft="@drawable/ic_comments"
android:text="10001"
android:textAlignment="center"
android:textColor="#000000"
android:textSize="12sp" />
<TextView
android:layout_width="match_parent"
android:layout_height="17dp"
android:layout_alignParentBottom="true"
android:layout_marginBottom="1dp"
android:background="#33000000" />
这就是我初始化recyclerview的方式:
RecyclerView recyclerView = findViewById(R.id.gridView);
recyclerView.setAdapter(new MediaAdapter(new ArrayList<>()));
recyclerView.setLayoutManager(new GridLayoutManager(this,3));
recyclerView.setItemAnimator(new DefaultItemAnimator());
我的观点是:不同的设备将具有不同的屏幕宽度,因此我不能在卡android:layout_width="match_parent"
中强加任何值,我将让layoutmanager来完成该工作
但是后来我不知道它以什么值结束,因此我尝试为android:layout_height="100dp"
猜测的任何值都不是平方。
如何调整高度以获得宽度的运行时值?
答案 0 :(得分:0)
获得此结果的最佳方法-用ConstraintLayout
包装布局。请查看下面的代码。
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<RelativeLayout
android:layout_width="0dp"
android:layout_height="0dp"
android:layout_gravity="center"
android:layout_margin="1dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintDimensionRatio="1:1"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent">
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/mediaThumbnail"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/link_blue"
android:scaleType="centerCrop" />
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/likes"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignLeft="@id/mediaThumbnail"
android:layout_alignBottom="@id/mediaThumbnail"
android:layout_margin="2dp"
android:drawableLeft="@drawable/ic_like"
android:text="10001"
android:textAlignment="center"
android:textColor="#000000"
android:textSize="12sp" />
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/comments"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignRight="@id/mediaThumbnail"
android:layout_alignBottom="@id/mediaThumbnail"
android:layout_margin="2dp"
android:drawableLeft="@drawable/ic_comments"
android:text="10001"
android:textAlignment="center"
android:textColor="#000000"
android:textSize="12sp" />
<TextView
android:layout_width="match_parent"
android:layout_height="17dp"
android:layout_alignParentBottom="true"
android:layout_marginBottom="1dp"
android:background="#33000000" />
</RelativeLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
答案 1 :(得分:0)
您可以这样做:
view.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
ViewGroup.LayoutParams params = view.getLayoutParams();
params.height = view.getWidth();
view.setLayoutParams(params);
view.getViewTreeObserver().removeOnGlobalLayoutListener(this);
}
});
(通过View
包裹ConstraintLayout
除外)没有真正的方法通过xml
实现。我编写的代码执行以下操作:调用onGlobalLayout
时,已经设置了Views
的大小。现在,当访问其LayoutParams
时,它将具有正确的值。然后我只说高度应等于宽度。最后一行删除了侦听器,因为附加侦听器会降低性能。