2011-10-30 17 views

回答

19

看看这个Android – Sectioned Headers in ListViews的例子,它很好地描述了如何在ListViews中实现分段头。

而且

android-amazing-listview

Jeff Sharkey's SeparatedListAdapter

MergeAdapter by CommonsWare

感谢。

+0

谢谢,我已经解决了这个问题。 – stream

+0

这些链接中的任何一个都可以帮助您在用户滚动浏览部分时将标题行固定到屏幕顶部? – topwik

+0

@towpse - 嘿,我没有明白你的意思吗? – user370305

12

创建您的列表项目布局一个头布局的例子。我们使用VISIBILITY选项来显示和隐藏HEADER LAYOUT。这将像节标题。

在适配器“getView”方法中,使用前一个LIST ITEMS“名称字段”的第一个字母检查“名称字段(在您显示的名称符合的情况下)”的第一个字母。如果它隐藏了HEADER LAYOUT(带有文本视图),那么用标题文本显示HEADER LAYOUT并显示名称字段的第一个字母。

这里是代码

String nameFirstLetter =“A”; //全局声明,而不是在getView中。

//里面的getView String nameF = Name.slice(0,1);

if(!nameFirstLetter.equals(nameF)){ 
     nameFirstLetter = nameF ;   
     holder.headerText.setText(nameFirstLetter); 
     holder.headerLayout.setVisibility(View.VISIBLE); 
    }else{ 
     holder.headerLayout.setVisibility(View.GONE); 
    } 

这是为了显示Android的列表视图节头中的最简单的方法,但它不会像iPhone节头,即工作。当我们向上/向下滚动时,部分标题会与其他列表项目一起隐藏。

+0

如果列表项是可点击的,这会使标题可点击。特别是现代Android中的涟漪,现在对用户来说是非常明显的。 –

3

如果任何人需要不同的解决方案,尤其是那些更习惯于iOS开发的解决方案,更喜欢它,或者想模拟iOS外观;我提出以下建议:

http://applidium.com/en/news/headerlistview_for_android/

的逻辑是一样的iOS和执行大部分的腿工作,为您

+0

如果你去他们的github回购,该项目已被标记为不推荐使用:https://github.com/applidium/HeaderListView – ThomasW

0

你可以看看到SectionedMergeAdapter。如果您有多个数据子列表,您可以将它们拼接在一起并为它们设置标题。

示例代码 -

ListView listView = (ListView) findViewById(android.R.id.list); 

ArrayAdapter<Integer> adapter1 = 
     new ArrayAdapter<>(this, R.layout.item_list, android.R.id.text1, arrayList1); 
ArrayAdapter<Integer> adapter2 = 
     new ArrayAdapter<>(this, R.layout.item_list, android.R.id.text1, arrayList2); 
ArrayAdapter<Integer> adapter3 = 
     new ArrayAdapter<>(this, R.layout.item_list, android.R.id.text1, arrayList3); 

TextView tv1 = new TextView(this); 
tv1.setText("Header 1"); 
TextView tv2 = new TextView(this); 
tv2.setText("Header 2"); 
TextView tv3 = new TextView(this); 
tv3.setText("Header 3"); 

SectionedMergeAdapter adapter = new SectionedMergeAdapter(); 

adapter.addSection(new SectionedMergeAdapter.Section(tv1, adapter1)); 
adapter.addSection(new SectionedMergeAdapter.Section(tv2, adapter2)); 
adapter.addSection(new SectionedMergeAdapter.Section(tv3, adapter3)); 

listView.setAdapter(adapter);