动态添加/删除页眉和页脚

时间:2012-02-29 16:25:30

标签: android listview

我需要能够动态添加和删除ListView中的页眉和页脚。

所以我使用页眉和页脚初始化我的活动,然后在某些时候我想隐藏它们,之后我需要添加以前的页眉和页脚,并保持相同的Adapter

所以我找到了这个解决方案,但它很难看,我真的希望还有另外一种方式 基本上,我必须设置一个空适配器才能添加标题视图,然后设置一个空适配器来添加页脚视图。为了完成我设置我的真实适配器。

编辑:我必须补充说,使用visibility属性(GONE& VISIBLE)不是这里的解决方案,因为标题&在我的中间过程中,页脚视图不能在适配器中。

    public class TestAdapterHeader extends ListActivity implements OnClickListener {
        private static String[] items = { "test 1", "test 2", "test 3", "test 4",
                "test 5", "test 6", "test 7", "test 8", "test 9", "test 10",
                "test 11", "test 12", "test 13", "test 14", "test 15", "test 16",
                "test 17", "test 18", "test 19", "test 20" };

        private ArrayAdapter mAdapter;
        private LinearLayout mParentView;
        private TextView mHeaderView, mFooterView;

        private boolean mViewsHidden = false;


        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);

            initViews();

            mAdapter = new ArrayAdapter<String>(this,
                    android.R.layout.simple_list_item_1, items);
            setListAdapter(mAdapter);
        }


        private void initViews() {
            // The main layout
            mParentView = new LinearLayout(this);
            mParentView.setOrientation(LinearLayout.VERTICAL);
            mParentView.setBackgroundColor(Color.BLACK);

            // The button to hide the views
            Button hideViewsButton = new Button(this);
            hideViewsButton.setText("Add/Remove views");
            hideViewsButton.setOnClickListener(this);

            // The listview
            ListView listView = new ListView(this);
            listView.setId(android.R.id.list);
            listView.setCacheColorHint(Color.TRANSPARENT);

            mParentView.addView(hideViewsButton);
            mParentView.addView(listView);

            // Set the content view
            setContentView(mParentView);

            AbsListView.LayoutParams lp = new AbsListView.LayoutParams(AbsListView.LayoutParams.MATCH_PARENT, 150);

            mHeaderView = new TextView(this);
            mHeaderView.setTextColor(Color.WHITE);
            mHeaderView.setBackgroundColor(Color.BLUE);
            mHeaderView.setGravity(Gravity.CENTER);
            mHeaderView.setLayoutParams(lp);
            mHeaderView.setText("Header");

            mFooterView = new TextView(this);
            mFooterView.setTextColor(Color.WHITE);
            mFooterView.setBackgroundColor(Color.BLUE);
            mFooterView.setGravity(Gravity.CENTER);
            mFooterView.setLayoutParams(lp);
            mFooterView.setText("Footer");


            getListView().addHeaderView(mHeaderView);
            getListView().addFooterView(mFooterView);
        }


        @Override
        public void onClick(View v) {
            mViewsHidden = !mViewsHidden;

            // Remove header & footer views
            if (mViewsHidden) {
                getListView().removeHeaderView(mHeaderView);
                getListView().removeFooterView(mFooterView);
            } 
            else {
                // Remove the ListAdapter to be able to add our headerView
                setListAdapter(null);
                getListView().addHeaderView(mHeaderView);

                // Set an empty ListAdapter to be able to add our footerView
                setListAdapter(new ArrayAdapter<String>(TestAdapterHeader.this, -1));
                getListView().addFooterView(mFooterView);

                // Re set our Adapter
                setListAdapter(mAdapter);
            }

            mParentView.requestLayout();

        }
    }

11 个答案:

答案 0 :(得分:8)

请勿尝试添加/删除页眉/页脚视图。

为了能够动态添加/删除页眉和页脚视图,只需在将适配器设置为页眉和页脚的RelativeLayout之前添加。 在此之后,您可以添加/删除您想要的RelativeLayouts。

将RelativeLayouts的大小设置为WRAP_CONTENT。

哈利

答案 1 :(得分:6)

您可以使用以下代码执行相同的操作

// to show the footer view
footerView.setVisibility(View.VISIBLE); 

// to hide the footer view    
footerView.setVisibility(View.GONE); 

答案 2 :(得分:3)

我只是遇到了这个问题而且我继续做了什么。在视图中添加标记,然后通过标记查找并删除它。

        final Button btnAddMore = new Button(this);
        btnAddMore.setTag("footer");   

        if(myList.getFooterViewsCount() >0)
        {
            View v = myList.findViewWithTag("footer");
            if(v != null)
            {
                 myList.removeFooterView(v);
            }           
        }

答案 3 :(得分:2)

您应该使用view.setVisibility(int visibility) View.GONE,View.VISIBLE或View.INVISIBLE

        ....
        if (mViewsHidden) {
            mHeaderView.setVisibility(View.GONE);
            mFooterView.setVisibility(View.GONE);
        } 
        .... 
        else {
            mHeaderView.setVisibility(View.VISIBLE);
            mFooterView.setVisibility(View.VISIBLE);
        } 
        .... 

答案 4 :(得分:1)

您需要在setAdapter之前在listview中添加页脚和标题视图,之后您可以使用setVisibility进行操作

祝你好运;)

答案 5 :(得分:0)

这似乎是少数解决方案之一。我只是尝试了一些非常相似的东西而且它有效,但我在同一条船上。对我而言,感觉就像是黑客。

还有一些其他选项,例如手动添加/删除/隐藏页眉/页脚到listview外部的视图中。但是,您可能无法获得很好的滚动效果,这几乎是listview标题的重点。

我刚尝试将视图设置为View.GONE,而不是视图消失,ListView顶部有一个间隙。

答案 6 :(得分:0)

我找到了解决这种情况的工作,尽管大多数人可能不喜欢它。只需在列表视图的上方和下方添加线性布局即可。现在,您可以使用可见性选项选项动态添加和删除视图。如果将参数设置为WRAP_CONTENT,那么如果没有子节点,布局将不占用空间。

答案 7 :(得分:0)

我遇到了类似的问题 - 我不得不动态添加或删除标题,我这样做了:
  - 我从适配器中删除了项目并设置了adapter=null;
  - 删除:r emoveHeaderView(mHeaderView);
  - 添加标题:addHeaderView(mHeaderView);
  - 再次创建适配器并设置内容

它有效,但没有动画,它看起来很难看

答案 8 :(得分:0)

its work fine for me!  

 private void addHeaderList(){
       mListView.setAdapter(null);
       mListView.addHeaderView(headerList);

   }
   private  void removeHeaderList(){
       mListView.removeHeaderView(headerList);
   }

     just called call function before setadapter again.
            addHeaderList();
            mListView.setAdapter(mAdapter);

答案 9 :(得分:0)

非常简单!

1)为您的页脚的布局容器提供 id

实施例。 footer.xml

 <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:id="@+id/parent_footer_search_list"
        android:layout_height="fill_parent"
        android:background="#fff"
        android:orientation="vertical">
       <TextView

            android:layout_width="fill_parent"
            android:layout_height="fill_parent"

            android:gravity="center|left"
            android:lineSpacingExtra="5dp"

            android:text="Create new list"


            android:textColor="#666666"
            android:textSize="16.8sp"
            android:textStyle="bold" />
      </LinearLayout>

在上面的xml中, parent_footer_search_list 是您的主要容器ID。 现在让我们回到你的片段/活动,在那里你已经夸大了这个页脚。 所以,为了删除它,

LinearLayout parentContainerForFooter = (LinearLayout) footer.findViewById(R.id.parent_footer_search_list);

**yourview**.removeFooterView(parentContainerForFooter); 

完成!这样,您使用正确的Android标准。 不要使用wrap_content,visibility GONE等等。它们只是黑客攻击!

答案 10 :(得分:-1)

尝试使用list.addFooterView(footerview)作为页脚,使用list.addHeaderView(headerview)作为页眉。