Нижняя панель кнопок перекрывает последний элемент Listview!
У меня есть список, который является частью деятельности. Я хочу, чтобы у пользователя был выбор для пакетного удаления элементов в просмотре списка, поэтому, когда он выбирает соответствующую опцию в меню, каждый элемент списка получает флажок рядом с ним. Когда пользователь нажимает на любой флажок, панель кнопок должна скользить снизу вверх (как в приложении gmail), а нажатие кнопки удаления удаляет выбранные элементы, однако нажатие кнопки отмены на панели снимает все отмеченные элементы.
Это моя страница layout.xml:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="@android:color/transparent"
>
<FrameLayout
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<LinearLayout
android:id="@+id/list_area"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_weight="1"
>
<ListView
android:id="@+id/mylist"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:background="@android:color/transparent"
android:drawSelectorOnTop="false"
android:layout_weight="1"
/>
<TextView
android:id="@+id/empty_list_message"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:textColor="#FFFFFF"
android:layout_gravity="center_vertical|center_horizontal"
android:text="@string/msg_for_emptyschd"
android:layout_margin="14dip"
android:layout_weight="1"
/>
</LinearLayout>
<RelativeLayout
android:id="@+id/bottom_action_bar"
android:orientation="horizontal"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:background="@drawable/schedule_bottom_actionbar_border"
android:layout_marginBottom="2dip"
android:layout_gravity="bottom"
android:visibility="gone"
>
<Button
android:id="@+id/delete_selecteditems_button"
android:text="Deleted Selected"
android:layout_width="140dip"
android:layout_height="40dip"
android:layout_alignParentLeft="true"
android:layout_marginLeft="3dip"
android:layout_marginTop="3dip"
/>
<Button
android:id="@+id/cancel_button"
android:text="Cancel"
android:layout_width="140dip"
android:layout_height="40dip"
android:layout_alignParentRight="true"
android:layout_marginRight="3dip"
android:layout_marginTop="3dip"
/>
</RelativeLayout>
</FrameLayout>
</LinearLayout>
до сих пор у меня все работает, за исключением того, что когда нижняя панель становится видимой при выборе флажка, она перекрывает последний элемент списка. Все остальные элементы списка можно прокрутить вверх, но вы не можете прокрутить вверх самый последний элемент списка, поэтому пользователь не может выбрать этот элемент, если он собирается. Вот скриншот перекрытия.
Я попытался использовать опцию нижнего колонтитула списка, но это добавляет панель в конец списка вместо того, чтобы держать ее фиксированной в нижней части экрана. Есть ли способ, которым я мог бы "поднять" просмотр списка достаточно, чтобы перекрытие не произошло?? Кстати, я уже пытался добавить нижнее поле к самому списку или LinearLayout, оборачивающему просмотр списка прямо перед тем, как сделать панель кнопок видимой, но он вводит другие ошибки, такие как нажатие одного флажка, проверяет другой флажок в просмотре списка.
2 ответа
Похоже, я решил проблему странного поведения флажка. Во-первых, проблема возникла потому, что как только размер списка изменяется, он перерисовывается, поэтому getView() снова вызывается для всех видимых элементов списка. Поскольку я использую ViewHolder, и представление снова используется, создается впечатление, что оно вызывает повторное использование этого же флажка для какого-либо другого элемента списка. Поэтому, когда я нажимал один флажок, вместо этого выбирался другой флажок. Поскольку этот вызов для обновления представления списка происходил только при изменении размера списка, а размер списка изменялся только при пометке флажка в списке, когда не было помечено никаких других флажков, эта проблема больше не появляется после того, как первый флажок был отмечен,
Я решил проблему, создав собственный класс коллекции для хранения отмеченных элементов, и, прежде чем поместить элемент в эту коллекцию, я клонирую тег отмеченного флажка и clicklistener в новый флажок и сохраняю этот новый флажок в коллекции. Это решило странное поведение флажков. Это может быть не лучшим решением проблемы, поэтому, если вы знаете что-нибудь лучше, пожалуйста, поделитесь.
Не проверял это, но я уверен, что именно FrameLayout вызывает это:). Потому что FrameLayout не заботится о "весе", который вы ему дали. FrameLayout просто помещает представления, которые вы вставляете, друг перед другом. И второй, который вы дали, вы сказали, android:layout_gravity="bottom", который заставляет его выравниваться в нижней части. но просто перед списком. Удалите FrameLayout, и он должен работать, я думаю.
Попробуйте это так:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="fill_parent"
android:layout_height="fill_parent" android:background="@android:color/transparent">
<LinearLayout android:id="@+id/list_area"
android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_weight="1">
<ListView android:id="@+id/mylist" android:layout_width="fill_parent"
android:layout_height="wrap_content" android:background="@android:color/transparent"
android:drawSelectorOnTop="false" android:layout_weight="1" />
<TextView android:id="@+id/empty_list_message"
android:layout_width="fill_parent" android:layout_height="wrap_content"
android:textColor="#FFFFFF" android:layout_gravity="center_vertical|center_horizontal"
android:text="@string/msg_for_emptyschd" android:layout_margin="14dip"
android:layout_weight="1" />
</LinearLayout>
<RelativeLayout android:id="@+id/bottom_action_bar"
android:orientation="horizontal" android:layout_width="fill_parent"
android:layout_height="wrap_content" android:background="@drawable/schedule_bottom_actionbar_border"
android:layout_marginBottom="2dip"
android:visibility="gone">
<Button android:id="@+id/delete_selecteditems_button"
android:text="Deleted Selected" android:layout_width="140dip"
android:layout_height="40dip" android:layout_alignParentLeft="true"
android:layout_marginLeft="3dip" android:layout_marginTop="3dip" />
<Button android:id="@+id/cancel_button" android:text="Cancel"
android:layout_width="140dip" android:layout_height="40dip"
android:layout_alignParentRight="true" android:layout_marginRight="3dip"
android:layout_marginTop="3dip" />
</RelativeLayout>
</LinearLayout>