我已经为我的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 TextView
和btn.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;
}
}
});
从图形上讲,这是怎么回事。
此外,该项目不再响应其他点击,因此我无法再次点击使其“缩小”。希望我已经清楚了,有人可以解决我的两个问题。
答案 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>