在XML中为ListView添加页眉/页脚

21

我知道如何在JAVA中添加页眉或页脚,但我想知道是否可以直接在XML中添加。

我不想模拟它,而是真正地将其添加为页脚或页眉!


2
当然可以。只需在您的ListView之前和之后添加它们即可。两个TextView可能是最简单的标题,但您也可以添加一些更复杂的布局。我通常这样做(我将整个内容放在RelativeLayout中)。它们将固定在原位,并且不会随着ListView的元素滚动。 - Phantômaxx
那么...只是在列表前后简单地添加它们就是正确的方法吗?我以为有比这更好的方法... - Scorpio
2
不,它并没有完全按照我的要求执行,因为我实际上想添加另一个视图,该视图将具有属性android:layout_below="@id/list_id",而某些列表可能具有页脚,也可能没有。你的解决方案在那里行不通。我知道如何克服这个问题,通过在另一个布局中添加列表和页脚,但我要求的是一个简单明了的解决方案,而不是一些“技巧”。 - Scorpio
1
也许我没有解释清楚。这不是“技巧”,而且非常简单明了...只需在RelativeLayout中添加一个视图(标题),对齐到父级顶部。再添加一个(页脚)对齐到父级底部。然后将您的ListView放置在标题下方和页脚上方。现在懂了吗?这难道不够直接了吗?它确实完全符合您的要求。 - Phantômaxx
我承认我的表述不够明确。我可能想要在列表中添加另一个页脚。但我无法这样做,因为我不知道该链接到哪个元素:列表还是其他页脚(有些列表有页脚,有些则没有)。正确的完整页脚行为允许通过编程方式添加或删除多个页脚。我想做的事情是能够向列表中添加页脚,而不管XML中是否有页脚。在JAVA中编写list.addFooter(footerView)将会在屏幕上相同的位置设置JAVA添加的页脚和XML添加的页脚。 - Scorpio
4
我需要的是如何添加真正的页眉/页脚,它们会随着其他列表项一起滚动,而不仅仅是在列表视图上方/下方显示的视图。 - ViliusK
4个回答

14
不,我认为这是不可能的。基于ListView源代码,只有overScrollHeader/overScrollFooter可以从XML属性中获取。但这些属性只接受可绘制对象。
如果您不想使用位于ListView上方/下方的布局技巧,您可以扩展ListView并在自定义的View中实现自己的页脚和页眉支持。这并不难,因为页脚和页眉已经被实现了。您只需要在自定义视图的构造函数中添加XML属性解析即可。

2
感谢你的回答,我只是想听听另一个人的意见! - Scorpio

5

我只是想达到同样的目的(保持代码更干净,使用XML进行标记和源代码进行逻辑),但我找到的唯一解决方案是在布局中的某个地方使用XML定义标题视图,然后将其分离并作为标题放入ListView中。

例如,有这个XML:

<ListView android:id="@+id/myListView">
</ListView>

<LinearLayout android:id="@+id/myHeader">
    ....
</LinearLayout>

您可以在您的代码中执行以下操作:
ListView myListView = (ListView) findViewById(R.id.myListView);
LinearLayout myHeader = (LinearLayout) findViewById(R.id.myHeader);

// Let's remove the myHeader view from it's current child...
((ViewGroup) myHeader.getParent()).removeView(myHeader);

// ... and put it inside ListView.
myListView.addFooterView(myHeader);

基本上,我们在这里所做的就是将充气的LinearLayout与其父视图分离,并将其设置为ListView标题子项。
虽然这不是理想的解决方案,但仍比手动创建/充气标题要简单。此外,如果您在一些“持有人”模式中使用它,它还利用了XML充气和视图重用的优势。
希望这对某人有所帮助。

3
尝试使用这个技巧时,程序崩溃了。我不得不将头部布局放到单独的布局 XML 文件中。 - ThomasW

0

这是我的做法,在我的适配器类中继承了BaseAdapter。我针对的是API 23:

    @Override
    public View getView(int position, View view, ViewGroup parent) {
    if (position == 0) {
        if (view == null) {
            LayoutInflater layoutInflater = LayoutInflater.from(mContext);
            view = layoutInflater.inflate(R.layout.test_results_header, parent, false);
        }
    } else {
        if (view == null) {
            LayoutInflater layoutInflater = LayoutInflater.from(mContext);
            view = layoutInflater.inflate(R.layout.test_result_item, parent, false);
        }
    }

相当简单,我为位置0膨胀一个标题XML和其余部分的内容XML。如果你知道想要标题或其他任何XML的位置,在你的逻辑中需要检查该位置,并为该位置膨胀相应的XML。

0

我创建了一个与适配器行的xml相同的xml资源(因此标题适合),并在添加适配器后将其添加到listview中:

listView.setAdapter(myRowsAdapter);

listView.addHeaderView(View.inflate(getContext(), R.layout.title_row, null));

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接