15

我有一个添加了页脚的 ListViewlistview.addFooterView(footerView);

除了在一种情况下,所有工作都按预期工作:当我的列表视图的项目没有填满整个屏幕时,我希望页脚位于屏幕底部,而不是位于中间。有没有办法轻松做到这一点?或者我应该改变我的布局?

谢谢

编辑:这可能会有所帮助(这就是我想要的) 在此处输入图像描述

4

4 回答 4

7

如果您希望它始终位于屏幕底部,无论您有多长ListView,请摆脱listview.addFooterView(footerView);并使用RelativeLayout. Give yourListView` 属性

 android:layout_alignParentTop="true"

并将属性提供给您的页脚

 android:layout_alignParentBottom="true"

如果这不能解决您的问题,那么请更具体地说明您想要什么,并在可能的情况下提供您想要什么的图片。

编辑

阅读评论后,这可能会起作用。可能有更简单的方法,但你可以做类似的事情

     listView.post(new Runnable()
     {       
         public void run()
        {
            int numItemsVisible = listView.getLastVisiblePosition() - 
            listView.getFirstVisiblePosition();
            if (itemsAdapter.getCount() - 1 > numItemsVisible)
            {   
                 // set your footer on the ListView
            }
            else
            {
                 footerView.setVisibility(View.VISIBLE);
            }
         }

footerView将是layout您将使用我上面引用的属性创建的自定义。这应该将其设置为visible如果项目不超过屏幕可以容纳的范围。如果它们超出了可以容纳的范围,那么您可以照ListView原样应用页脚视图。这可能不是最好的方法,但它首先想到的。您将在设置Adapter.

于 2013-08-17T00:14:05.393 回答
1

您不能将 ListView 页脚用作整个布局的页脚。最好将 RelativeLayout 作为布局的根元素,然后是它的直接子元素,其中包含具有以下属性的页脚视图:android:layout_alignParentBottom="true"

于 2013-09-25T11:44:50.013 回答
0

除了@codeMagic 响应之外,您还可以添加一个侦听器来检查您的适配器何时更新,然后更新页脚

registerDataSetObserver(new DataSetObserver() {
            @Override
            public void onChanged() {
                super.onChanged();
                updateSmartFooter();
            }
        });

其中 updateSmartFooter 是他描述的功能

 private void updateSmartFooter {
     listView.post(new Runnable()
     {       
         public void run()
        {
            int numItemsVisible = listView.getLastVisiblePosition() - 
            listView.getFirstVisiblePosition();
            if (itemsAdapter.getCount() - 1 > numItemsVisible)
            {   
                 // set your footer on the ListView
            }
            else
            {
                 footerView.setVisibility(View.VISIBLE);
            }
         }
      }
}
于 2014-12-05T17:42:10.523 回答
0

在花了很多时间研究之后,我找到了最好的解决方案。请看一下:https ://stackoverflow.com/a/38890559/6166660 和https://github.com/JohnKuper/recyclerview-sticky-footer

详情:

  • 创建一个StickyFooterItemDecoration 扩展 RecyclerView.ItemDecoration就像下面的示例代码。
  • 之后,将 ItemDecoration 设置为您的 recyclerView:

recyclerListView.addItemDecoration(new StickyFooterItemDecoration());

--------------------------------------

 public class StickyFooterItemDecoration extends RecyclerView.ItemDecoration {

    private static final int OFF_SCREEN_OFFSET = 5000;

    @Override
    public void getItemOffsets(Rect outRect, final View view, final RecyclerView parent, RecyclerView.State state) {
        int adapterItemCount = parent.getAdapter().getItemCount();
        if (isFooter(parent, view, adapterItemCount)) {
            if (view.getHeight() == 0 && state.didStructureChange()) {
                hideFooterAndUpdate(outRect, view, parent);
            } else {
                outRect.set(0, calculateTopOffset(parent, view, adapterItemCount), 0, 0);
            }
        }
    }

    private void hideFooterAndUpdate(Rect outRect, final View footerView, final RecyclerView parent) {
        outRect.set(0, OFF_SCREEN_OFFSET, 0, 0);
        footerView.post(new Runnable() {
            @Override
            public void run() {
                parent.getAdapter().notifyDataSetChanged();
            }
        });
    }

    private int calculateTopOffset(RecyclerView parent, View footerView, int itemCount) {
        int topOffset = parent.getHeight() - visibleChildsHeightWithFooter(parent, footerView, itemCount);
        return topOffset < 0 ? 0 : topOffset;
    }

    private int visibleChildsHeightWithFooter(RecyclerView parent, View footerView, int itemCount) {
        int totalHeight = 0;
        int onScreenItemCount = Math.min(parent.getChildCount(), itemCount);
        for (int i = 0; i < onScreenItemCount - 1; i++) {
            totalHeight += parent.getChildAt(i).getHeight();
        }
        return totalHeight + footerView.getHeight();
    }

    private boolean isFooter(RecyclerView parent, View view, int itemCount) {
        return parent.getChildAdapterPosition(view) == itemCount - 1;
    }
}
于 2018-11-02T10:39:59.073 回答