我有一个简单的线性布局,我在适配器中充气:
@Override
public View getView(final int position, View convertView, final ViewGroup parent) {
if (convertView == null) {
convertView = inflater.inflate(R.layout.category_listview_row, parent, false);
} else {
((LinearLayout)convertView).removeAllViews();
}
if (LAYOUT_TYPES.GRID.equals(layoutType)) {
convertView = CategoryFragment.getViewForGridLayout(context, displayArray, position, convertView, listener);
} else {
convertView = CategoryFragment.getViewForListLayout(context, displayArray, position, convertView, listener);
}
return convertView;
}
此处,category_listview_row
如下:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:gravity="top"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
getViewForGridLayout
方法以编程方式创建一个或多个视图,并将其添加到convertView
。
我希望所有子视图在高度上匹配此父视图,但是我无法使其工作。这是以编程方式添加的子视图的外部线性布局:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/base_listview_style_one_layout"
android:orientation="horizontal"
android:padding="@dimen/node_default_spacing"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:background="#5ab9c6">
此布局包含根据要显示的实际数据删除的子视图,因此有些会比其他更长。但是我希望它们都是父母的高度所以它看起来并不奇怪。
这是我所看到的截图:
任何提示?谢谢!
答案 0 :(得分:3)
我建议使用带有GridLayoutManager的Recyclerview。
如果您希望某些项目跨越多列,可以通过在GridLayoutManager上设置SpanSizeLookup来实现。
答案 1 :(得分:1)
可以忽略您的布局参数。请确保您正在向convertView添加子视图,如下所示:
View view = inflater.inflate( R.layout.item /* resource id */,
convertView /* parent */,
true /*attachToRoot, you dont need to call addView then*/);
答案 2 :(得分:1)
除了删除textview之外,为什么不让它不可见或将其颜色设置为白色以占据空间?
答案 3 :(得分:1)
请将您的linearlayout高度从换行内容更改为&#34; match_parent&#34;。
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:gravity="top"
android:layout_width="match_parent"
android:layout_height="wrap_content" />`
答案 4 :(得分:0)
试试这个我希望它能解决你的问题。
答案 5 :(得分:0)
@zundi您可以使用视图持有者设计模式和回收器视图适配器,并定义哪一行需要有两个图像,哪一行需要有一个。它比使用线性布局简单得多。
Recycleview show different view types对如何做到这一点有相当不错的解释。
还要回答你制作的问题
包含2个项目的一些行和包含1个项目的其他行
您可以使用GridLayoutManager的setSpanSizeLookup(GridLayoutManager.SpanSizeLookup spanSizeLookup)方法并在活动中定义它。
RecycleView's span size为您提供有关如何实现这一目标的更多信息。
mLayoutManager.setSpanSizeLookUp(new GridLayoutManager.SpanSizeLookUp() {
@Override
public int getSpanSize(int position) {
if(position == 0)
return 2; //here the view takes up two spaces in a row(header)
else return 1; //here view takes 1 space i.e., 2 views in a total row
} });
在上面的示例中,我的网格布局管理器根据不同的位置获取2个视图持有者,并决定其标头是否填充并填充数据。
不是在布局中提供匹配父级和换行父级,而是给出一个固定的&#39; dp&#39;高度。这应该使观点看起来一致。
答案 6 :(得分:0)
@zundi如果使用RecyclerView和LayoutManager以正确的方式进行,这会大大简化您的生活,但有一点学习曲线并不适合您,这里有一个尚未被提及的选项:< / p>
您可以在包含子文本的TextView上定义android:lines = x。
只是match_parent对你不起作用,因为你希望LinearLayout将其子节点及其子节点的高度换行为match_parent,这是一个循环依赖
答案 7 :(得分:0)
此方法可以在您正在使用的线性布局或TextView上执行
您已设置
<强>机器人:layout_height = “match_parent”强>
但不是高度,所以这是一个简单的案例
<强>机器人:layout_height = “match_parent”强>
所以,即使字符串中没有值,它仍然会包含分配给它的高度