Android 为ListView添加分段标头的方法

效果图:

我记得github上有一个类似的效果github类似效果

说一下实现这个效果的思路:在列表项中嵌入分段标头,然后根据需要显示或者隐藏分段标头,创建一个特殊的TextView,让其叠加在列表的顶部,当列表滚动到一个新的分段时,就更新其内容

创建列表布局

创建一个xml,随列表滚动的分段标头和列表顶部的固定分段标头复用这个布局文件

header.xml

<?xml version="1.0" encoding="utf-8"?> <TextView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/header" style="@android:style/TextAppearance.Small" android:layout_width="fill_parent" android:layout_height="wrap_content" android:background="#0000ff" />

主布局list.xml

<?xml version="1.0" encoding="utf-8"?> <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" > <ListView android:id="@android:id/list" android:layout_width="fill_parent" android:layout_height="fill_parent" /> <include layout="@layout/header" /> </FrameLayout>

创建列表项布局文件list_item.xml,包含数据项和分段标头

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="vertical" > <include layout="@layout/header" /> <TextView android:id="@+id/label" style="@android:style/TextAppearance.Large" android:layout_width="fill_parent" android:layout_height="wrap_content" /> </LinearLayout>

SectionAdapter.java

public class SectionAdapter extends ArrayAdapter<String> { private Activity activity; public SectionAdapter(Activity activity, String[] objects) { super(activity, R.layout.list_item, R.id.label, objects);//为自定义视图指定XML布局文件 this.activity = activity; } @Override public View getView(int position, View view, ViewGroup parent) { if (view == null) { view = activity.getLayoutInflater().inflate(R.layout.list_item, parent, false); } TextView header = (TextView) view.findViewById(R.id.header); String label = getItem(position); if (position == 0//检查列表项起始字母是否发生了改变,如果发生改变,该列表项就是分段中的第一项,修改分段标头的内容并显示该分段标头,否则隐藏 || getItem(position - 1).charAt(0) != label.charAt(0)) { header.setVisibility(View.VISIBLE); header.setText(label.substring(0, 1)); } else { header.setVisibility(View.GONE);//隐藏分段标头 } return super.getView(position, view, parent); } }

主界面

public class Hack26Activity extends ListActivity { private TextView topHeader;//用于访问分段标头 private int topVisiblePosition = -1; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.list); topHeader = (TextView) findViewById(R.id.header); setListAdapter(new SectionAdapter(this, Countries.COUNTRIES)); //设置滚动监听器,当用户滚动列表时,检查位置是否发生了变化,如果改变,调用setTopHeader更新悬浮的分段标头,当列表第一次显示时,确保根据第一个列表项初始化分段标头 getListView().setOnScrollListener( new AbsListView.OnScrollListener() { @Override public void onScrollStateChanged(AbsListView view, int scrollState) { // Empty. } @Override public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { if (firstVisibleItem != topVisiblePosition) { topVisiblePosition = firstVisibleItem; setTopHeader(firstVisibleItem); } } }); setTopHeader(0); } private void setTopHeader(int pos) { final String text = Countries.COUNTRIES[pos].substring(0, 1); topHeader.setText(text);//更新文本内容 } }

以上这篇Android 为ListView添加分段标头的方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。

时间: 2024-08-02 06:14:19

Android 为ListView添加分段标头的方法的相关文章

android给listview添加下拉刷新崩溃

问题描述 android给listview添加下拉刷新崩溃 logcat: 10-09 15:17:36.549 15984-15984/com.example.jkd.fchangshi D/dalvikvm﹕ VFY: replacing opcode 0x6f at 0x0000 10-09 15:17:36.549 15984-15984/com.example.jkd.fchangshi I/dalvikvm﹕ Could not find method android.view.Vi

Android使用ListView批量删除item的方法_Android

本文实例讲述了Android使用ListView批量删除item的方法.分享给大家供大家参考,具体如下: 利用CheckBox选中一个或多个item,最后批量删除它们. 程序运行效果图如下:   下面开始上码: (代码已更正,已解决滚动时紊乱的问题) package com.test.adapter; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map;

Android实现ListView异步加载的方法(改进版)_Android

本文实例讲述了Android实现ListView异步加载的方法.分享给大家供大家参考,具体如下: @Override public View getView(int position, View convertView, ViewGroup parent) { ---- ViewHolder VH = null; ---- VH.mImageView.setTag(position); VH.mThumb.setImageDrawable(imageLoader.loadDrawable(pos

Android使用ListView批量删除item的方法

本文实例讲述了Android使用ListView批量删除item的方法.分享给大家供大家参考,具体如下: 利用CheckBox选中一个或多个item,最后批量删除它们. 程序运行效果图如下: 下面开始上码: (代码已更正,已解决滚动时紊乱的问题) package com.test.adapter; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; i

Android实现ListView异步加载的方法(改进版)

本文实例讲述了Android实现ListView异步加载的方法.分享给大家供大家参考,具体如下: @Override public View getView(int position, View convertView, ViewGroup parent) { ---- ViewHolder VH = null; ---- VH.mImageView.setTag(position); VH.mThumb.setImageDrawable(imageLoader.loadDrawable(pos

Android实现RecyclerView添加分割线的简便方法

1.前言 刚开始学习RecyclerView的时候我跟着一个视频学的,当时添加分割线是从外面导入一个Java类,然后使用里面的函数来创建分割线的,所以一直以来我都是这样做的.直到前几天才无意中发现,原来v7包中提供了一个DividerItemDecoration类,利用它,我们可以很简单地实现RecyclerView的分割线!那还等什么呢?赶紧用起来. 2.创建一个简单的RecyclerView 首先当然应该来一个RecyclerView,这里就不再赘述了,随便造点数据就好.直接上代码: pub

Android在listview添加checkbox实现原理与代码_Android

主界面CheckBoxinListViewActivity.java代码如下: 复制代码 代码如下: public class CheckBoxinListViewActivity extends Activity { /** Called when the activity is first created. */ private MyAdapter adapter; private ListView listview; private Button checkAll; private But

Android在listview添加checkbox实现原理与代码

主界面CheckBoxinListViewActivity.java代码如下: 复制代码 代码如下: public class CheckBoxinListViewActivity extends Activity { /** Called when the activity is first created. */ private MyAdapter adapter; private ListView listview; private Button checkAll; private But

android基础教程之android的listview与edittext冲突解决方法

最近遇到一个关于android软键盘的问题.在ListView中每个Item中都有个EditText,在最后的几个Item中,EditText第一次点击界面还能向上弹出,正常显示, 但第二次点击时,软件盘就把最后的几个Item给正当住了.这样很影响用户体验的. 其实解决的办法只要想一下,我相信有经验的开发人员就能够想到,让软键盘在消失的时候让相应Item中的EditText消失焦点clearFouce():但是有个关键的问题, 就是在获得返回事件的时候,如果获得的事件不对那就不会达到想要的效果.