在Android

时间:2016-12-30 20:18:29

标签: android android-layout android-linearlayout

我有一个简单的线性布局,我在适配器中充气:

    @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">

此布局包含根据要显示的实际数据删除的子视图,因此有些会比其他更长。但是我希望它们都是父母的高度所以它看起来并不奇怪。

这是我所看到的截图:

  • 第一行没问题,因为这两个项目都有标题和子文字
  • 在第二行,第二个项目没有子文本,因此视图较小。但是,我希望它占据行的整个高度,以便单行中的所有项目具有相同的高度。

enter image description here

任何提示?谢谢!

8 个答案:

答案 0 :(得分:3)

我建议使用带有GridLayoutManager的Recyclerview。

如果您希望某些项目跨越多列,可以通过在GridLayoutManager上设置SpanSizeLookup来实现。

以下是一个简单示例https://stackoverflow.com/a/26907508/4498224

答案 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)

  1. 将父布局的高度设置为wrap_content。
  2. 将子视图的高度设置为match-parent。
  3. 试试这个我希望它能解决你的问题。

答案 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”

所以,即使字符串中没有值,它仍然会包含分配给它的高度