Пользовательские элементы ListView некорректны графически - PullRequest
0 голосов
/ 22 ноября 2018

Я определил пользовательский элемент в XML для моего ListView, и я хочу, чтобы каждое из них имело пять полей: три уже 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;
            }
        }
    });

Графически это происходит следующим образом.

enter image description here


Более того, элемент больше не реагирует на другие щелчки, поэтому я не могу вернуть их «сжатыми» за секундунажмите.Надеюсь, я был ясен, и кто-то может решить обе мои проблемы.

Ответы [ 2 ]

0 голосов
/ 22 ноября 2018

Выполнение работает, но графически это не то, что я ожидал.

Вы устанавливаете атрибут android:layout_marginBottom="368dp" для Button, поэтому элемент списка становится таким огромным.

Более того, элемент не реагирует на другиещелкает больше, поэтому я не могу вернуть их обратно «сжатыми» с помощью второго нажатия

Это происходит потому, что расширенный элемент содержит (видимый) Button: если вы пропустите Button,тогда предмет "термоусадочный".См., Например, этот пост о возможных обходных решениях

Также обратите внимание, что вы можете столкнуться с проблемами при прокрутке, поскольку вы изменяете элементы ListView "извне" (просто протестируйте его с помощьюбольшой набор студентов).Элементы ListView должны быть изменены только в getView() и основаны на текущих данных для каждой позиции.Таким образом, вы должны отслеживать расширенное состояние строк в адаптере, например, используя List<Boolean> или лучше (для производительности) SparseBooleanArray и onClick(), чтобы изменить соответствующие данные и вызвать notifyDatasetChanged()

.
0 голосов
/ 22 ноября 2018

Измените атрибут высоты корневого макета с «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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...