ListView/GridView:正确设置子布局

问题描述:

我想创建一个ListView(同一个问题与GridView相关),其中项目具有非常具体的LayoutParams。就拿这个例子,我想每一行是一个LinearLayout100dp高度:ListView/GridView:正确设置子布局

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="horizontal" 
    android:layout_width="match_parent" 
    android:layout_height="100dp"> 

    <TextView 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:id="@+id/pd_textview" 
     android:gravity="center_vertical"/> 

</LinearLayout> 

当我使用这个XML布局与标准BaseAdapter实施getView()是膨胀的意见没有LayoutParams为我LinearLayout GET应用(每行简单地围绕文本的大小包裹在TextView):

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    // Inflate view if necessary 
    if (convertView == null) { 
     convertView = ((Activity) mContext).getLayoutInflater().inflate(ID_LAYOUT, null, false); 
    } 

    // Return the view 
    return convertView; 
} 

垂钓Android documentation的适当部分周围,它说以下约getView()这也解释了当前的行为:

把那在 数据集的指定位置显示的数据视图。您可以手动创建视图,也可以从 XML布局文件中对其进行充气。当视图膨胀时,父视图(GridView,GridView, ListView ...)将应用默认布局参数,除非您使用膨胀(int,android.view.ViewGroup,布尔值)来指定根视图 并防止附件根。

我的问题很简单,我应该怎么做呢?使用具有所需的LayoutParams根视图的建议似乎令人费解,因为我想用视图膨胀视图,我试图膨胀(是的,我可以膨胀一个静态视图并将其保留为成员该类引用...但这似乎很愚蠢)。另一种选择是仅定义XML中行项目的内容,并且每次都手动创建容器及其容器。

有没有一种'正确'的方式(即不是浪费的破解),我错过了简单地创建与在XML中定义的LayoutParams项目?

+0

你的意思是说,该行项目的高度不'ListView'中的100dp? – Apoorv 2014-09-13 12:38:47

+1

是的,当这段代码运行时,我最终得到了一个'ListView'的项目,这些项目是TextView中文本的大小 - 而不是Listd的100dp高的项目 – 2014-09-13 12:43:21

+1

您可以为它们分配'height'在'getView'方法中。 – Apoorv 2014-09-13 12:44:27

我更愿意把这个评论,但我没有这样做,需要50声誉......

这里有问题的详细解释:

http://www.doubleencore.com/2013/05/layout-inflation-as-intended/

的主要观点是:

“的问题,这就是Android。layout_xxx属性始终在父视图的背景下进行评估。结果,没有任何已知的父母,你宣布所有的LayoutParams r你的XML树的OOT元素只会得到扔掉[,...]”

所以,实际上,解决的办法是:

convertView = ((Activity) mContext).getLayoutInflater().inflate(ID_LAYOUT, parent, false);