带有固定标题的自定义ListView,在设置填充时导致Jank

hav*_*chr 10 android listview lag

我有一个自定义listView,其中包含一个固定标题和x个"俯卧撑"视图,可以向上推并隐藏在列表视图上方.

我附上图片来解释它们.对不起"黑色审查",只是为了隐藏客户的标识等.

我的问题是,如果我在固定的标题视图中添加填充,我将在它后面浮动listview项.

如果您搜索PinnedHeaderListView,即列表视图中的静态视图和标题,则使用与您将找到的相同技术实现固定标题视图.

我找到了一种方法来启用填充,即通过将固定标头应用相同的填充到实际的listView,但只有当静态标头可见时.

但是,调用setPadding会导致一个非常明显的Jank,我想删除它.有谁知道如何删除这个jank?

我有一个简单的视图和虚拟数据的简单应用程序,它没有显示这个jank,所以可能jank的数量取决于单元格布局的复杂性.

private void updateIfShouldShowStaticHeaderView() {

    //unfortunately setting the padding of the listView causes JANK.

    //any ideas?
    int bottomOfFloatingHeader = floatingHeader.getBottom();
    if (bottomOfFloatingHeader < mHeaderViewHeight) {
        staticHeaderViewIsVisible = true;
        staticHeader.setVisibility(View.VISIBLE);

        //need to set padding of listView to avoid having list-view items float behind my padded static header
        setPadding(0, staticHeader.getPaddingTop(), 0, getPaddingBottom());
    } else {
        staticHeaderViewIsVisible = false;
        staticHeader.setVisibility(View.INVISIBLE);
        //need to set padding of listView to avoid having list-view items float behind my padded static header
        setPadding(0, 0, 0, getPaddingBottom());
    }
}
Run Code Online (Sandbox Code Playgroud)

首先是显示推升标题的图像 显示推升的标题

这是一张图片,展示了如何在填充的静态固定视图后面绘制内容.值得注意的是,如果我调整listView的填充,它的工作方式是有意的,但是当它打开/关闭静态标题视图时,我会得到Jank(减速).

如果我不调整填充,则显示可见的错误

hav*_*chr 0

由于 listView 上的 setPadding 会导致布局调用,因此效率非常低,尤其是在 listView 单元格复杂的情况下。解决方案是将背景图形添加到代表所需填充的固定标题中。这意味着整个固定的标头是坚固的。然后列表视图的元素将绘制在该图形后面。这就是我们最终得到的解决方案。

它可以工作,但最好剪辑 listView。