2011-01-05 1 views
2

У меня есть listview, который является частью Activity. Я хочу, чтобы у пользователя был выбор для пакетного удаления элементов в списке, поэтому, когда он выбирает соответствующую опцию из меню, каждый элемент списка получает флажок рядом с ним. Когда пользователь нажимает любой флажок, панель кнопок должна скользить снизу (как в приложении gmail), а кнопка «Удалить» удаляет выбранные элементы, однако нажатие кнопки отмены на панели отменяет все отмеченные элементы.Нижняя панель кнопок перекрывает последний элемент Listview!

Это моя страница 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> 

до сих пор, у меня все работает за исключением того, что, когда нижняя полоса становится видимой при выборе галочки, она перекрывает последний элемент списка. Все остальные элементы списка можно прокручивать, но вы не можете прокручивать последний элемент списка, поэтому пользователь не может выбрать этот элемент, если он намеревается. Вот screenshot of the overlap.

Я пробовал использовать параметр нижнего колонтитула listview, но добавляет его в конец списка, а не фиксирует его в нижней части экрана. Есть ли способ, который я мог бы «поднять» список достаточно, чтобы совпадение не произошло? BTW. Я уже пробовал добавлять нижний край к самому списку или LinearLayout, обертывая список прямо перед тем, как сделать панель кнопок видимой, но она вводит другие ошибки, такие как щелчок по одному флажку, который проверяет еще один флажок в списке.

+0

Что произойдет, если вы замените RelativeLayout на LinearLayout, который имеет тот же вес, что и LinearLayout, содержащий ListView? – James

ответ

0

Не проверял это, но я уверен, что именно 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> 
+0

Эй, Патрик! Спасибо вам за помощь. Он работал частично. Причина частично в том, что теперь мне не нужно вручную устанавливать нижний предел, чтобы это помогло. Но у меня все еще есть проблемы, с которыми я ранее связан с настройкой поля обзора: нажатие на одну галочку пытается проверить другой флажок. Эта проблема не появляется, когда framelayout добавляет панель кнопок над списком. Любые идеи, что может быть причиной этого? – elto

+0

хороший вопрос .. сложно отгадать почему.если вы поделитесь небольшим примером (источником всего этого проекта), чем, может быть, я попытаюсь понять это. –

0

Кажется, я решил проблему странного поведения флажка. Во-первых, проблема заключалась в том, что, как только размер списка изменяется, он перерисовывается, поэтому getView() снова вызывается для всех видимых элементов списка. Поскольку я использую ViewHolder, и представление используется повторно, похоже, что он снова возвращает тот же флажок для другого элемента списка. Поэтому, когда я нажимал на один флажок, вместо этого менял другой флажок. Поскольку этот вызов для обновления списка отображался только при изменении размера списка, а список изменялся только при маркировке флажка в списке, когда никакой другой флажок не был помечен, эта проблема не появляется снова после того, как был отмечен первый флажок ,

Я решил проблему, создав собственный класс коллекции для хранения отмеченных элементов, и перед тем, как поместить элемент в эту коллекцию, я клонирую тег checkbox и кликлайнер в новый флажок и сохраняю этот новый флажок в коллекция. Это решило странное поведение флажков. Это может быть не лучшее решение проблемы, поэтому, если вы знаете что-то лучше этого, пожалуйста, поделитесь.