使用 onListItemClick() 时更改 ListView 行 xml 布局资源

change ListView row xml layout resource when onListItemClick() is used

我有这个自定义布局,row.xml 在我的 ListView 行中:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="40dp"
    android:orientation="horizontal"
    android:weightSum="10">

    <TextView
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="9"
        android:id="@+id/rowTextView"
        android:typeface="serif"
        android:gravity="center_vertical"
        android:textSize="15sp"
        android:layout_marginLeft="5dp" />

    <ImageView
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="1"
        android:id="@+id/swipeImageView"
        android:src="@mipmap/swipe"
        android:alpha="0.5"
        android:padding="11dp" />

</LinearLayout>

现在我想更改 row.xml 此布局 clicked_row.xml 使用 onListItemClick():

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="40dp"
    android:orientation="horizontal"
    android:weightSum="10">

    <EditText
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="9"
        android:id="@+id/rowTextView"
        android:typeface="serif"
        android:gravity="center_vertical"
        android:textSize="15sp"
        android:layout_marginLeft="5dp" />

    <ImageView
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="1"
        android:id="@+id/saveImageView"
        android:src="@mipmap/trash"
        android:alpha="0.5"
        android:padding="11dp" />

</LinearLayout>

我正在尝试使用 this answer;但他们似乎在操纵布局内视图的可见性,而不是用一种布局替换另一种布局。我不确定我应该用什么来替换 row.xml for clicked_row.xml:

@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
    super.onListItemClick(l, v, position, id);


     //Code for replacing row.xml with clicked_row.xml


}

感谢您的帮助!

您可以将 TextViewImageView 添加到同一布局。您可以隐藏一个在 onListItemClick

上的可见性

但这会在您滚动列表时导致问题,因为 Android 重用了列表项视图。因此,不要直接访问 ListItemView,而是在模型 class 中添加一个 属性,例如 selected.

Adapater.getView()hide/show视图元素中根据选择字段值

此 post 将帮助您了解 Android ListView 的工作原理: How ListView's recycling mechanism works

我认为更好的方法是合并 2 个文件:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="40dp"
    android:orientation="horizontal"
    android:weightSum="10">

<TextView
    android:layout_width="0dp"
    android:layout_height="match_parent"
    android:layout_weight="9"
    android:id="@+id/rowTextView"
    android:typeface="serif"
    android:gravity="center_vertical"
    android:textSize="15sp"
    android:layout_marginLeft="5dp" />

<EditText
    android:layout_width="0dp"
    android:layout_height="match_parent"
    android:layout_weight="9"
    android:id="@+id/rowEditText"
    android:typeface="serif"
    android:gravity="center_vertical"
    android:textSize="15sp"
    android:layout_marginLeft="5dp"
    android:visibility="gone"/>

<ImageView
    android:layout_width="0dp"
    android:layout_height="match_parent"
    android:layout_weight="1"
    android:id="@+id/swipeImageView"
    android:src="@mipmap/swipe"
    android:alpha="0.5"
    android:padding="11dp" />

</LinearLayout>

然后:

@Override
    protected void onListItemClick(ListView l, View v, int position, long id) {
        super.onListItemClick(l, v, position, id);
        ((ViewGroup)v).findViewById(R.id.rowTextView).setVisibility(View.GONE);
        ((ViewGroup)v).findViewById(R.id.rowEditText).setVisibility(View.VISIBLE);
        ImageView imageView = (ImageView)((ViewGroup)v).findViewById(R.id.swipeImageView);
        imageView.setImageDrawable(imageView.getContext().getResources().getDrawable(R.mipmap.trash));



        //Code for replacing row.xml with clicked_row.xml


    }