2012-02-29 145 views
8

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

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

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

编辑:我要补充的是使用visibility属性(GONE &可见)这里不是一个解决方案,因为我的中间过程中的页眉页脚&意见一定不能在适配器。

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(); 

     } 
    } 
+0

你有没有解决这个问题?我有类似的需求。 – Vadi 2012-04-15 04:16:44

+0

不,我没有找到比我给出的解决方案更聪明的东西。但至少它有效。 – Chayy 2012-06-15 11:01:15

回答

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); 
     } 
     .... 
+0

就像我向Maneesh解释的那样,使用可见性属性在这里不是一个解决方案。 – Chayy 2012-02-29 21:02:41

6

您可以使用下面的代码做同样的

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

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

我真的很喜欢简单地删除它们。用户可以使用拖放系统重新排列列表中的项目,就像我们在音乐应用程序中看到的一样。在这种情况下,页眉和页脚不得在适配器中。 – Chayy 2012-02-29 21:01:28

+0

@Chayy你的黑客适用于大多数设备和操作系统,你可能会被卡住。但是,我发现了困难的方式setListAdapter(null); &getListView()。addHeaderView(mHeaderView);不能以可靠的方式在2.3.5上工作(特别是droid 3手机)。因此,即使您不喜欢,设置可见性也许是您的最佳选择。 – LEO 2013-08-20 12:33:08

+0

不适用于4.4 – 2014-02-20 17:07:34

1

你需要添加和页脚在setview之前的列表视图中的标题视图,之后你可以使用setVisibility来操作

祝你好运;)

0

这似乎是那里为数不多的解决方案之一。我只是尝试了一些非常相似的东西,但它工作正常,但我在同一条船上。对我来说,这感觉就像一个黑客。

还有几个其它选项,如手动添加/删除/隐藏的页眉/页脚到列表视图以外的视图。但是,您可能无法获得很好的滚动效果,这几乎是listview标题的要点。

我只是想设置一个以View.GONE代替作为视图消失,有一个在ListView控件的顶部的差距。

+4

您不应该为标题视图本身设置View.GONE。您应该在所需的内容视图周围放置一个包含wrap_content高度的线性布局。您将此父级布局设置为标题。当您想要隐藏或显示标题时,您可以将内容视图(而不是父视图)的可见性设置为View.GONE。这样就不会出现间隙。这确实是一个黑客般的解决方案,但它的工作原理:-D – stoilkov 2012-09-03 05:52:50

0

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

+0

好吧,列表视图上方的视图不是标题,它不会随列表视图一起滚动。页脚也是一样。 – Chayy 2012-10-09 13:00:29

+0

据我所知,ListView的内置标题不会随列表视图一起滚动。为什么不插入没有任何信息的标题并在运行时更改其内容/可见性?你说你不能让他们在那里,但我不知道为什么。 – Slynk 2012-10-09 16:15:03

+0

那么,我的ListView可以设置在编辑模式下,我可以重新排序和删除项目。要做这个操作,我需要先删除页眉和页脚,然后让用户编辑列表视图,当他离开编辑模式时,我添加页眉/页脚。也许更清晰的方法是适应这种编辑模式来忽略页眉和页脚... – Chayy 2012-10-12 10:02:41

8

不要尝试添加/删除页眉/页脚视图。

为了能够添加/删除的页眉和页脚视图动态地,简单地设定适配器的RelativeLayout到页眉和页脚前添加。 之后,你可以添加/删除你想要的RelativeLayouts。

将RelativeLayouts的大小设置为WRAP_CONTENT。

哈利

+2

没有设置适配器滚动ListView到最佳?这是非常棒的效果。如何避免这种情况?顺便说一句。每个人都应该感谢谷歌这样美妙的API ...... :( – Piotr 2014-03-31 23:42:50

0

我得到了类似的problem-我不得不动态添加或删除页眉和我做了这样:
- 我删除从适配器项目和设定adapter=null;
- 对于去除,R emoveHeaderView(mHeaderView);
- 对于添加标题:addHeaderView(mHeaderView);
- 再次创建适配器以及内容

它的工作原理,但没有动画,它看起来丑陋

-1

尝试使用list.addFooterView(footerview)为页脚和list.addHeaderView(headerview)用于首标。

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); 
2

我刚刚有这个问题,继承人我做了什么。为视图添加标签并通过标签找到并移除它。

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

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

它很简单!

1)提供和ID布局容器的你页脚。

Ex。 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,可见性GONE等,他们只是黑客!