Android - 当用作ListView行View时,LinearLayout中的TextView的Weight属性被忽略

时间:2014-08-06 11:42:05

标签: android android-listview android-custom-view android-layout-weight

我有一个CustomListView,当我长按一行时,该行的布局会更改为不同的listRow Layout。到目前为止,一切正常,然而,新视图的布局被压缩。这是我的xml文件:

search_result_layout.xml - >这是customListView Adapter使用的原始xml文件。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/search_result_layout"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:minHeight="50dp"
    android:orientation="horizontal"
    android:padding="1dip" >

    <TextView
        android:id="@+id/dialogItemName"
        android:layout_width="0dp"
        android:layout_weight="0.54"
        android:layout_marginRight="5dp"
        android:layout_height="match_parent"
        android:text="Item Name"
        android:gravity="center"
        android:textSize="10pt" />


    <TextView
        android:id="@+id/price"
        android:layout_width="0dp"
        android:layout_weight="0.14"
        android:layout_height="match_parent"
        android:text="Price"
        android:gravity="center"
        android:textSize="10pt" />

    <TextView
        android:id="@+id/discount"
        android:layout_width="0dp"
        android:layout_weight="0.10"
        android:layout_height="match_parent"
        android:text="Discount"
        android:gravity="center"
        android:textSize="10pt" />

    <TextView
        android:id="@+id/qtyInput"
        android:layout_width="0dp"
        android:layout_weight="0.14"
        android:layout_height="match_parent"
        android:text="qtyInput"
        android:gravity="center"
        android:textSize="10pt" />

    <TextView
        android:id="@+id/discInput"
        android:layout_width="0dp"
        android:layout_weight="0.11"
        android:layout_height="match_parent"
        android:text="discInput"
        android:gravity="center"
        android:textSize="10pt" />


</LinearLayout>

这是我的search_result_inflate.xml文件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:minHeight="50dp"
    android:orientation="horizontal"
    android:padding="1dip" >

    <TextView
        android:id="@+id/dialogItemName"
        android:layout_width="0dp"
        android:layout_weight="0.54"
        android:layout_marginRight="5dp"
        android:layout_height="match_parent"
        android:text="Item Name"
        android:gravity="center"
        android:textSize="10pt" />


    <TextView
        android:id="@+id/price"
        android:layout_width="0dp"
        android:layout_weight="0.14"
        android:layout_height="match_parent"
        android:text="Price"
        android:gravity="center"
        android:textSize="10pt" />

    <TextView
        android:id="@+id/discount"
        android:layout_width="0dp"
        android:layout_weight="0.10"
        android:layout_height="match_parent"
        android:text="Discount"
        android:gravity="center"
        android:textSize="10pt" />

    <EditText
        android:id="@+id/qtyInput"
        android:layout_width="0dp"
        android:layout_weight="0.14"
        android:layout_height="match_parent"
        android:hint="qtyInput"
        android:inputType="number"
        android:gravity="center"
        android:textSize="10pt" />

    <EditText
        android:id="@+id/discInput"
        android:layout_width="0dp"
        android:layout_weight="0.11"
        android:layout_height="match_parent"
        android:hint="discInput"
        android:inputType="number|date"
        android:gravity="center"
        android:textSize="10pt" />


</LinearLayout>

两个文件几乎相同,只是最后两个TextView变为EditTexts,因此用户可以输入他或她想要的值。

另外,请注意我将weight放在textViews和EditTexts中,以便当用户将视图从纵向移动到横向时,空间最大化。

resultListView.setOnItemLongClickListener(new OnItemLongClickListener() {

    @Override
    public boolean onItemLongClick(AdapterView<?> parent, View view,
            int position, long id) {
        // TODO Auto-generated method stub

        TextView textViewQuantity = (TextView)view.findViewById(R.id.qtyInput);
        TextView textViewDiscountReq = (TextView)view.findViewById(R.id.discInput);
        TextView textViewName = (TextView)view.findViewById(R.id.dialogItemName);
        TextView textViewPrice = (TextView)view.findViewById(R.id.price);
        TextView textViewDiscount = (TextView)view.findViewById(R.id.discount);

        textViewQuantity.setVisibility(View.GONE);
        textViewDiscountReq.setVisibility(View.GONE);
        textViewName.setVisibility(View.GONE);
        textViewPrice.setVisibility(View.GONE);
        textViewDiscount.setVisibility(View.GONE);

        LinearLayout ll_inflate = (LinearLayout)view.findViewById(R.id.search_result_layout);
        Log.d("Angelo", "original width = " + ll_inflate.getWidth());

        View child = getLayoutInflater().inflate(R.layout.search_result_inflate, null);

        TextView newText = (TextView)child.findViewById(R.id.qtyInput);
        newText.setText(textViewQuantity.getText().toString());

        EditText enter_txt = (EditText)child.findViewById(R.id.qtyInput);   

        ll_inflate.addView(child);
        Log.d("Angelo", "not original width = " + ll_inflate.getWidth());


        return false;
    }
});

当我长按一个项目时,布局会发生变化。但是,TextViews和EditTexts彼此相邻,就好像忽略了weight属性一样。起初我认为在视图改变之前和之后宽度可能已经改变,但Log告诉我它有1136宽度(我使用的是第二代Nexus 7)。现在我是空白的,父母的宽度没有改变,但重量值被忽略了。我该如何解决?是否会以编程方式为权重分配一个可行的解决方案?

另外,跟进问题,我只希望最后2个TextViews更改为EditTexts。所以我试图实现这种效果的是,从原始布局中,我通过执行textView.getText().toString()拉出前3个字段(项目名称,价格,折扣)的值,并从新布局获取文本视图,使用setText()但到目前为止,它没有用,有什么建议吗?

更新

Upon reading this link,我认为当我使用LinearLayout作为ListView Row View时,LinearLayout中TextViews的Weight属性被忽略。嵌套另一个线性布局也没有多大帮助。

我在其中放置了另一个LinearLayout:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:minHeight="50dp"
    android:orientation="horizontal"
    android:padding="1dip" >

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="horizontal"
        android:padding="1dip" >

        <TextView
            android:id="@+id/dialogItemName"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_marginRight="5dp"
            android:layout_weight="0.70"
            android:gravity="center"
            android:text="Item Name"
            android:textSize="23sp" />

        <TextView
            android:id="@+id/price"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="0.16"
            android:gravity="center"
            android:text="Price"
            android:textSize="23sp" />

        <TextView
            android:id="@+id/discount"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="0.12"
            android:gravity="center"
            android:text="Discount"
            android:textSize="23sp" />

        <EditText
            android:id="@+id/qtyInput"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="0.16"
            android:gravity="center"
            android:hint="qtyInput"
            android:inputType="number"
            android:textSize="23sp" >

            <requestFocus />
        </EditText>

        <EditText
            android:id="@+id/discInput"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="0.13"
            android:gravity="center"
            android:hint="discInput"
            android:inputType="number|date"
            android:textSize="23sp" />
    </LinearLayout>

</LinearLayout>

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

改为打电话:

ll_inflate.addView(child, new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT));