Нижняя панель кнопок перекрывает последний элемент Listview!

У меня есть список, который является частью Activity. Я хочу, чтобы у пользователя был выбор для пакетного удаления элементов в списке, поэтому, когда он выбирает соответствующий параметр в меню, каждый элемент списка получает флажок рядом с ним. Когда пользователь нажимает любой флажок, панель кнопок должна сдвигаться снизу вверх (как в приложении 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>

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

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


person elto    schedule 05.01.2011    source источник
comment
Что произойдет, если вы замените RelativeLayout на LinearLayout, который имеет тот же вес, что и LinearLayout, содержащий ListView?   -  person James    schedule 05.01.2011


Ответы (2)


Не тестировал это, но я почти уверен, что причиной этого является 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>
person Patrick Boos    schedule 05.01.2011
comment
Привет, Патрик !! Спасибо вам за помощь. Частично это сработало. Частично причина в том, что теперь мне не нужно вручную устанавливать нижнее поле, так что это помогло. Но у меня все еще есть проблемы, с которыми я ранее сталкивался с настройкой поля представления: а именно, щелчок по одной галочке пытается установить другую галочку. Эта проблема не возникает, когда framelayout добавляет панель кнопок над списком. Есть идеи, что может быть причиной этого? - person elto; 05.01.2011
comment
хороший вопрос .. трудно догадаться почему. если бы вы поделились небольшим примером (источником всего проекта), возможно, я мог бы попытаться понять это. - person Patrick Boos; 06.01.2011

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

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

person elto    schedule 07.01.2011