如何在粘性 'header' 和 Android 中的列表视图之间放置一个按钮

How to put a button in between a sticky 'header' and a Listview in Android

我的目标是有一个粘性 header、一个清除按钮,然后是一个 ListView(按此顺序)。

+-----------------+  
|      Header     |    (Sticky)
+-----------------+
| "Clear" button  |    (NOT sticky)
+-----------------+
|    ListView     |    (Also NOT sticky)
|                 |
|                 |
|                 |
|                 |
|                 |
|                 |
+-----------------+

下面的方法几乎 可以满足我的要求。 header 是粘性的,ListView 功能正常。但是按钮是粘性的(它在粘性 header 的正下方标记)。

<RelativeLayout>

    <!-- Used for Sticky Header -->
    <RelativeLayout
    android:id="@+id/top_control_bar"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:minHeight="?attr/actionBarSize">

        <Button/>

        <TextView/>
    </RelativeLayout>   <!-- End XML for sticky hader -->

    <!--  Button to clear bookmarks  -->
    <Button
        android:id="@+id/clearButton"
        android:text="CLEAR"
        android:layout_height="wrap_content"
        android:layout_width="wrap_content"
        android:layout_below="@+id/top_control_bar"
        android:onClick="clearBookmarks"/> 

    <!--  ListView for displaying questions  -->
    <ListView
        android:id="@+id/listViewBrowse"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_below="@id/clearButton" >
    </ListView>

</RelativeLayout>

我想我需要停止使用这个 属性

    android:layout_below="@+id/top_control_bar"

用于 "clear" 按钮。但如果我只是摆脱它,它就不起作用(如果我这样做,按钮会覆盖 header )。我应该调整什么?或者我应该尝试什么而不是这种方法?

* **解决方案 ***

按照这些步骤解决了我的问题:

  1. 创建一个新的布局文件:non_sticky_header.xml(其中包含我的清除按钮)。
  2. 从主布局中删除清除按钮。
  3. 通过扩充我的 'non_sticky_header' 资源文件动态创建视图 object。此视图 object 是 header.
  4. 使用 addHeaderView() 将 header object 添加到我的 ListView。

第 3 步和第 4 步的代码:

View header = getLayoutInflater().inflate(R.layout.non_sticky_header, null);  
list.addHeaderView(header);   

来源
-请参阅@nDroidDev 对此 post 的第三个答案;我的解决方案与步骤 3 和 4 略有不同。
-(参见 this S.O. Post about using addHeaderView(),它解释了步骤 3 和 4(来自@user370305)。

我同意@Manish。假设按钮是列表的第一项(位置 = 0)。 你可以用上面的代码处理它的动作:

listView.setOnItemClickListener(new OnItemClickListener() {
        public void onItemClick(AdapterView<?> parent, View view,
                int position, long id) {

            if (position == 0) {
             clearAllListMethod();
           }
        }
    });

您还可以轻松地在适配器中设置其可见性。 希望对你有帮助。

我认为,而不是将清除按钮添加到 Realtive 布局中,您应该像这样将其添加到列表视图的 header 中..

1) 创建一个新的布局文件说 non_sticky_header.xml 并添加以下行..

<RelativeLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

<!--  Button to clear bookmarks  -->
<Button
        android:id="@+id/clearButton"
        android:text="CLEAR"
        android:layout_height="wrap_content"
        android:layout_width="wrap_content"
        android:layout_below="@+id/top_control_bar"
        android:onClick="clearBookmarks"/> 

</RelativeLayout>

2) 现在从您的主布局中删除此清除按钮并像这样更新它... 只需在主布局中保留 stick headre 和 listview 即可。

<RelativeLayout>

    <!-- Used for Sticky Header -->
    <RelativeLayout
    android:id="@+id/top_control_bar"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:minHeight="?attr/actionBarSize">

        <Button/>

        <TextView/>
    </RelativeLayout>   <!-- End XML for sticky hader -->

    <!--  ListView for displaying questions  -->
    <ListView
        android:id="@+id/listViewBrowse"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_below="@id/clearButton" >
    </ListView>

</RelativeLayout>

3) 最后,将 non_sticky_header.xml 添加为 java 文件中列表的 header,像这样...

 //code to add header and footer to listview
        LayoutInflater inflater = getLayoutInflater();
        ViewGroup header = (ViewGroup) inflater.inflate(R.layout.non_sticky_header, listView, false);
        listView.addHeaderView(header, null, false);

希望对您有所帮助...:)

Button 添加为 ListView 的 header。

喜欢:

Button headerButton = (Button) getLayoutInflater().inflate(R.layout.header_button, null);
mListView.addHeader(headerButton);

但在添加适配器之前添加header。