底部按钮栏与Listview的最后一个元素重叠!

时间:2011-01-05 08:07:52

标签: android listview checkbox buttonbar

我有一个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>

到目前为止,我已经完成了所有工作,只是当选中复选框时底栏变为可见时,它会重叠列表的最后一个元素。所有其他列表项都可以向上滚动,但是您无法向上滚动列表的最后一项,因此如果用户不能选择该项。这是screenshot of the overlap

我尝试过使用listview页脚选项,但是将栏附加到列表末尾而不是将其固定在屏幕底部。有没有办法可以“提升”列表视图,以便重叠不会发生? 顺便说一句,我已经尝试将下边距添加到listview本身,或者在使按钮栏可见之前将LinearLayout包装在listview中,但它引入了其他错误,例如单击一个复选框检查listview中的另一个复选框。

2 个答案:

答案 0 :(得分: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>

答案 1 :(得分:0)

好像我已经解决了奇怪的复选框行为的问题。首先,问题发生了,因为一旦listview被调整大小,它就会重绘自身,因此会再次为所有可见列表项调用getView()。由于我正在使用ViewHolder,并且视图正在被重用,似乎它会导致相同的复选框再次被重用于其他列表项。因此,当我点击一个复选框时,其他一些复选框被点击了。因为,只有在调整列表大小时才会进行刷新列表视图的调用,并且只有在没有标记其他复选框时在列表中标记复选框时才会调整列表大小,在第一个复选框被标记后,此问题不再出现。

我通过创建自定义集合类来存储已检查项目来解决问题,在将项目放入此集合之前,我将单击的复选框标记和clicklistener克隆到一个新复选框中,然后将新复选框存储到集合中。这解决了复选框的奇怪行为。 这可能不是问题的最佳解决方案,所以如果你知道比这更好的事情,请分享。