ListView自定义项在图形上不正确

时间:2018-11-22 17:01:49

标签: android android-studio

我已经为我的ListView定义了一个XML自定义项目,我希望它们中的每一个都有五个字段:三个已经visible,另外两个(电话和删除,见下文)gone直到执行点击操作为止。执行有效,但是图形上却不是我所期望的。

该项目的定义如下:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">


    <TextView
        android:id="@+id/txt.name"
        android:layout_width="120dp"
        android:layout_height="40dp"
        android:layout_marginStart="68dp"
        android:layout_marginTop="16dp"
        android:gravity="center_horizontal|center_vertical"
        android:text="Name"
        android:textAlignment="center"
        android:textSize="18sp" />

    <TextView
        android:id="@+id/txt.surname"
        android:layout_width="120dp"
        android:layout_height="40dp"
        android:layout_marginTop="16dp"
        android:layout_marginEnd="68dp"
        android:gravity="center_horizontal|center_vertical"
        android:layout_toEndOf="@id/txt.name"
        android:text="Surname"
        android:textAlignment="center"
        android:textColor="@android:color/holo_blue_bright"
        android:textSize="18sp"
        android:textStyle="bold" />

    <TextView
        android:id="@+id/txt.id"
        android:layout_width="90dp"
        android:layout_height="30dp"
        android:layout_marginStart="144dp"
        android:layout_marginTop="64dp"
        android:gravity="center_horizontal|center_vertical"
        android:text="ID"
        android:textAlignment="center"
        android:textSize="18sp" />

    <TextView
        android:id="@+id/txt.tel"
        android:layout_width="90dp"
        android:layout_height="30dp"
        android:layout_marginTop="64dp"
        android:layout_marginEnd="40dp"
        android:layout_toEndOf="@id/txt.id"
        android:gravity="center_horizontal|center_vertical"
        android:text="Tel"
        android:visibility="gone"
        android:textAlignment="center"
        android:textSize="18sp" />

    <Button
        android:id="@+id/btn.delete"
        android:layout_width="70dp"
        android:layout_height="38dp"
        android:layout_below="@id/txt.id"
        android:layout_marginBottom="368dp"
        android:layout_toEndOf="@id/txt.id"
        android:visibility="gone"
        android:text="Delete"
        android:textAllCaps="false" />

</RelativeLayout>

,它会正确地放大到ListView中,但是当我单击项目时,txt.tel TextViewbtn.delete Button应该出现在屏幕上。我写的代码是

ListView list= findViewById(R.id.advanced_list);
    final StudentAdapter adapter= new StudentAdapter(
            this,
            R.layout.custom_list_item,
            m.getStudents()
            //this works fine, previous code omitted
    );

    list.setAdapter(adapter);

    list.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {

            TextView tel= view.findViewById(R.id.txt_tel);
            Button delete= view.findViewById(R.id.btn_delete);

            int visible= tel.getVisibility();

            //doesn't work
            switch (visible){
                case (View.VISIBLE):
                    tel.setVisibility(View.GONE);
                    delete.setVisibility(View.GONE);
                    break;
                case (View.GONE):
                    tel.setVisibility(View.VISIBLE);
                    delete.setVisibility(View.VISIBLE);
                    break;
            }
        }
    });

从图形上讲,这是怎么回事。

enter image description here


此外,该项目不再响应其他点击,因此我无法再次点击使其“缩小”。希望我已经清楚了,有人可以解决我的两个问题。

2 个答案:

答案 0 :(得分:1)

  

执行有效,但是从图形上看这并不是我所期望的。

您为android:layout_marginBottom="368dp"设置了一个属性Button,这就是列表项变得如此巨大的原因。

  

此外,该项目不再响应其他点击,因此我无法再次点击将它们“缩小”

之所以会这样,是因为展开的项目包含一个(可见的)Button:如果省略Button,则该项目是“可收缩的”。参见this post,了解可能的解决方法

还请注意,滚动时可能会遇到问题,因为您是从外部更改ListView项的(只需对大量学生进行测试即可)。 ListView项只能在getView()中并且基于每个位置的当前数据进行更改。因此,您应该跟踪适配器中各行的展开状态,例如使用List<Boolean>或更高(出于性能考虑)使用SparseBooleanArray,然后onClick()更改相应的数据并调用notifyDatasetChanged()

答案 1 :(得分:0)

将根布局的height属性从“ match_parent”更改为“ wrap_content”

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"> ... </RelativeLayout>