Android listview页脚视图

时间:2014-09-17 09:10:24

标签: android android-listview

我对页脚视图有疑问。我通过动态加载项目创建列表视图。当按钮在页脚视图中单击时。页脚附加到列表视图时,通过调用两个下一个方法:

protected void addFooterView() {
        removeFooterView();
        searchListView.post(new Runnable() {
            @Override
            public void run() {
                ListAdapter adapter = searchListView.getAdapter();
                searchListView.setAdapter(null);
                searchListView.addFooterView(footerView);
                searchListView.setAdapter(adapter);
            }
        });
    }

    protected void removeFooterView() {
        searchListView.post(new Runnable() {
            @Override
            public void run() {
                if (searchListView.getFooterViewsCount() > 0) {
                    ListAdapter adapter = searchListView.getAdapter();
                    searchListView.setAdapter(null);

                    while (searchListView.getFooterViewsCount() > 0) {
                        searchListView.removeFooterView(footerView);
                    }

                    searchListView.setAdapter(adapter);
                }
            }
        });
    }

夸大观点:

   private void declareViewAndButton(View view) {
        this.searchListView = (ListView) view.findViewById(R.id.searchListView);
        this.footerView = LayoutInflater.from(getActivity()).inflate(R.layout.search_list_view_footer, searchListView, false);
    }

因此,当页脚视图位于可见位置列表视图的底部时。并通过滚动返回,页脚视图高度大小动态变化。怎么解决?或者告诉我在哪里可以找到问题原因?抱歉我的英文。

1 个答案:

答案 0 :(得分:1)

从KITKAT api开始你可以在任何地方调用aading / remove footer和header方法,设置适配器与否无关紧要。 就像在官方文档中说的那样,在设置适配器之前需要调用aading / remove footer和header view。但这几乎是正确的,如果在你的情况下需要管理页脚而不是标题。在一些设备页脚工作成功,另一个需要单个重置适配器,工作正常后。我不知道,这是bug还是功能!!

所以,经过一些实验,我写了添加和删除页脚视图方法。效果很好:

protected void addFooterView() {
        removeFooterView();
        searchListView.post(new Runnable() {
            @Override
            public void run() {
                searchListView.addFooterView(footerView);

                if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) {
                    int lastViewedPosition = searchListView.getFirstVisiblePosition();
                    View v = searchListView.getChildAt(0);
                    int topOffset = (v == null) ? 0 : v.getTop();

                    searchListView.setAdapter(searchAdapter);
                    searchListView.setSelectionFromTop(lastViewedPosition, topOffset);
                }
            }
        });
    }

    protected void removeFooterView() {
        searchListView.post(new Runnable() {
            @Override
            public void run() {
                while (searchListView.getFooterViewsCount() > 0) {
                    searchListView.removeFooterView(footerView);
                }
            }
        });
    }

在19,16,10 api上测试过。