android - Recyclerview 网格布局管理器显示不必要的空间
问题描述
我正在尝试在 gridview 布局管理器中的 recyclerview 中显示自定义布局,但是在第二行之后,额外的空间进入了边界。因此我的问题是如何删除多余的空间以及空间背后的原因是什么?
附加图像和代码片段。
自定义项目视图布局
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/frameLayout"
android:layout_margin="2dp"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<ImageView
android:id="@+id/img_content"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="1dp"
android:layout_marginRight="1dp"
android:layout_marginTop="1dp"
android:src="@drawable/redcap"
android:scaleType="fitCenter"/>
<TextView
android:id="@+id/tv_info"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@id/img_content"
android:layout_centerHorizontal="true"
android:background="@color/white"
android:layout_margin="1dp"
android:layout_gravity="center|bottom|left"
android:gravity="left"
android:padding="8dp"
android:textColor="@color/primary_dark"
android:textSize="@dimen/TvTextSizeNormal"/>
</RelativeLayout>
适配器代码
public class MyAdapter extends BaseAdapter {
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View view = null;
final Item item = mItems.get(position);
if (convertView == null) {
Holder holder = new Holder();
view = View.inflate(mContext, R.layout.myItemView, null);
holder.img_content = view.findViewById(R.id.img_content);
holder.tv_info = (TextView) view.findViewById(R.id.tv_info);
view.setTag(holder);
} else {
view = convertView;
}
Holder holder = (Holder) view.getTag();
holder.tv_info.setText(item.getCategoryName());
Picasso.get().load(url).fit().into(holder.img_content);
return view;
}
}
主要活动
myAdapter= new MyAdapter(MainActivity.this,subCategoryList);
recyclerGridView.setLayoutManager(new GridLayoutManager(this,2));
recyclerGridView.setAdapter(myAdapter);
解决方案
使用以下类,这将根据实际图像调整 ImageView 的高度:
import android.content.Context;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
import android.util.Log;
public class ManageHeightByWidthImageView extends androidx.appcompat.widget.AppCompatImageView {
public int width = -1;
public int height = -1;
public ManageHeightByWidthImageView(Context context) {
super(context);
}
public ManageHeightByWidthImageView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public ManageHeightByWidthImageView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
Drawable d = getDrawable();
if (d != null) {
int imageIntrinsicWidth = d.getIntrinsicWidth();
int imageIntrinsicHeight = d.getIntrinsicHeight();
Log.d(ManageHeightByWidthImageView.class.getName(), imageIntrinsicWidth + " -- " + imageIntrinsicHeight);
int w = MeasureSpec.getSize(widthMeasureSpec);
int h = w * d.getIntrinsicHeight() / d.getIntrinsicWidth();
width = w;
height = h;
try {
setMeasuredDimension(w, h);
} catch (NullPointerException ignored) {
}
} else {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}
}
}
如何在您的代码中使用:
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/frameLayout"
android:layout_margin="2dp"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<com.proportionlImageView.ManageHeightByWidthImageView
android:id="@+id/img_content"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="1dp"
android:layout_marginRight="1dp"
android:layout_marginTop="1dp"
android:minHeight="100dp"
android:src="@drawable/redcap"
android:scaleType="fitCenter"/>
<TextView
android:id="@+id/tv_info"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@id/img_content"
android:layout_centerHorizontal="true"
android:background="@color/white"
android:layout_margin="1dp"
android:layout_gravity="center|bottom|left"
android:gravity="left"
android:padding="8dp"
android:textColor="@color/primary_dark"
android:textSize="@dimen/TvTextSizeNormal"/>
</RelativeLayout>
推荐阅读
- spring-batch - Spring Batch 从一个表中读取并插入到另一个表中
- python - 如果传递索引,np.array_split() 需要更长的时间
- python - CSS 选择器格式不正确
- batch-file - 我正在尝试使用 %%~tf 检查日期修改显示 ECHO 已关闭
- javascript - 试图找出什么 addEventListeners 没有被触发
- excel - 将重复和唯一的行复制到不同的 Excel 工作表
- kotlin - kotlin 子类可以覆盖基类的“内部函数”吗?
- asp.net - 如何在 Linq 中获取最大日期?
- c# - 强制将默认属性值写入 xml 文件
- python - Python 将 HTML 从 url 解析为 PD ValueError:未找到表