0

对于每个类别,我有一个布局要在另一个布局中动态地膨胀:

LinearLayout l = (LinearLayout) findViewById(R.id.container);

        for (CategoryEB e :categoryList){
            LayoutInflater layoutInflater = (LayoutInflater)this.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            LinearLayout linLayout = (LinearLayout)layoutInflater.inflate(R.layout.inflated_layout, l);
            TextView view = (TextView)linLayout.findViewById(R.id.lable);
            view.setText(e.getName());
        }

这是要膨胀的 xml (inflated_layout.xml):

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    android:layout_width="wrap_content" android:layout_height="wrap_content"
    xmlns:android="http://schemas.android.com/apk/res/android">

    <TextView android:id="@+id/lable"
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
        android:text="xxx"
        android:layout_alignParentLeft="true"
        android:layout_centerVertical="true"
        android:paddingLeft="6dip"/>

</LinearLayout>

但通过这种方式,只有第一个项目被填充了正确的值。其他的 categoryList 显示为 xxx(如 xml 中所述)。

如何在列表中显示所有正确的名称?

4

3 回答 3

2

我最近两次遇到同样的问题。我第一次使用 LinearLayout 所以第一个答案很好 - 将每个视图 id 设置为 0 不是问题。

然而,我第二次使用 RelativeLayout - 将 ids 设置为 0 只是破坏了整个视图,因为它被定位为“leftTo:some_id”等等。

我尝试了一点,结果发现在设置其所有组件之后将视图添加到其容器可以解决问题(我们只需要使用参数对其进行膨胀,以防止将膨胀布局添加到其父级)。这个想法是让膨胀的视图在任何其他视图之外,包含具有相同 id 的组件,因此 findViewById 只能找到我们感兴趣的那个,而不是之前膨胀的那个。

ViewGroup inflatedLayout = (ViewGroup) layoutInflater.inflate(R.layout.some_id, mDirectChildInScrollView, false);
ImageView imageView = (ImageView) inflatedLayout.findViewById(R.id.image_view);
... do your stuff here ...
mDirectChildInScrollView.addView(inflatedLayout);

您可以稍后使用 ViewHolder 模式访问所需的元素,而无需调用 findViewById。

于 2014-10-31T12:59:47.323 回答
1

问题是 linLayout 将指向您的主布局容器 l。这样您就只能找到 ID 为 R.id.label 的视图的第一个实例。

一种简单的解决方案是在初始化标签后更改标签的 id。像这样的东西:

LinearLayout l = (LinearLayout) findViewById(R.id.container);

    for (CategoryEB e :categoryList){
        LayoutInflater layoutInflater = (LayoutInflater)this.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        LinearLayout linLayout = (LinearLayout)layoutInflater.inflate(R.layout.inflated_layout, l);
        TextView view = (TextView)linLayout.findViewById(R.id.lable);
        view.setText(e.getName());
        view.setId(0);  //this way you wont find the same view twice.
    }
于 2011-07-27T09:43:01.450 回答
0

在我看来,您应该在循环中动态创建新的 TextView,而不是反复尝试复制和编辑同一个视图。从逻辑上讲,这似乎是一个问题。我将创建一个 categoryList 大小的文本视图数组,并使用它来存储对您在循环中创建的新文本视图的引用:

TextView textViewArray[] = new TextView[categoryList.length];

LinearLayout l = (LinearLayout) findViewById(R.id.container);
LinearLayout linLayout = (LinearLayout) findViewById(R.id.CREATE_A_LIN_LAYOUT_IN_YOUR_CONTAINER_XML);

int i = 0; //Used for array addressing

    for (CategoryEB e :categoryList){
        TextView view = new TextView(); //declare new TextView
        view.setText(e.getName()); //set Text
        textViewArray[i] = view; //Save into array for future reference
        linLayout.addView(view); //Add TextView to linearLayout
        i++;
    }
于 2011-07-27T06:27:14.057 回答