Android ListView添加标头 联系人

来源:互联网 发布:网络最火尴舞视频 编辑:程序博客网 时间:2024/05/27 16:42

GitHub源代码


Android 并非支持原生分段标头,但是,通过将分段标头嵌入到列表项中,并在适当的时候令其可视或隐藏,这样

可以很容易地添加分段标头.

部分代码:

列表布局:

为分段标头创建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="45dp"    android:gravity="center|start"    android:text="标题"    android:background="#ff0000"    android:textColor="#ffffff" />

分段标头指定了自定义背景色以区别于列表中的普通文本,现在,在创建一个包含顶部固定分段标头的xml布局,

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"        android:layout_width="fill_parent"        android:layout_height="55dp" /></FrameLayout>
id使用android id ,因此可以在listActivity的子类中使用它.将分段标头包含在帧布局中,这样该标头就可以与列表重叠在一起,以显示当前所在分段.

最后,创建列表项对应的XML文件,该布局既包含数据项也包含分段标头;

list_item.xml

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:orientation="vertical">    <TextView        android:id="@+id/label"        android:layout_width="fill_parent"        android:layout_height="wrap_content" />    <include        layout="@layout/header"        android:layout_width="fill_parent"        android:layout_height="20dp" /></LinearLayout>
 为列表创建适配器,使用Adapter的子类用于填充列表项.与其他创建分段列表的不同之处,是 只需要重写getView(),不需要返回多种类型,也不需要在分段列表与原始列表转换数据项的位置.

SectionAdapter.java

public class SectionAdapter extends ArrayAdapter<String> {    private Activity activity;    public SectionAdapter(Activity context, String[] objects) {        super(context, R.layout.list_item, R.id.label, objects);        this.activity = context;    }    @Override    public View getView(int position, View convertView, ViewGroup parent) {        if (convertView==null){            convertView = activity.getLayoutInflater().inflate(R.layout.list_item,parent,false);        }        TextView header = (TextView)convertView.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, convertView, parent);    }}

MainActivity.java

package com.akm.myapplication;import android.app.ListActivity;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.widget.AbsListView;import android.widget.ArrayAdapter;import android.widget.ListView;import android.widget.TextView;public class MainActivity 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));        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);//更新文本显示    }}

1 0
原创粉丝点击