Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/194.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何使用addHeaderView()在单个ListView中添加多个标题?_Android_Listview_Header - Fatal编程技术网

Android 如何使用addHeaderView()在单个ListView中添加多个标题?

Android 如何使用addHeaderView()在单个ListView中添加多个标题?,android,listview,header,Android,Listview,Header,Android的addHeaderView()能否用于在单个ListView中添加多个标题?有人能举例说明如何做到这一点吗 我可以通过操纵IconicAdapter类来实现我想要的。。。我有什么理由不这样做吗?我觉得这可以修改为更高级的实现。在我的例子中,我知道我将有两个部分,每个部分有一个页眉+2行 class IconicAdapter extends ArrayAdapter<String> { IconicAdapter() { super(Conta

Android的addHeaderView()能否用于在单个ListView中添加多个标题?有人能举例说明如何做到这一点吗

我可以通过操纵IconicAdapter类来实现我想要的。。。我有什么理由不这样做吗?我觉得这可以修改为更高级的实现。在我的例子中,我知道我将有两个部分,每个部分有一个页眉+2行

class IconicAdapter extends ArrayAdapter<String> {
    IconicAdapter() {
        super(ContactTabProfileResource.this, R.layout.row_iconic, mArrayList);
    }


    public View getView(int position, View convertView, ViewGroup parent) {

        LayoutInflater inflater = getLayoutInflater();
        View row = null;

        if(position == 1 || position == 5) { // phone 
            row = inflater.inflate(R.layout.row_iconic, parent, false);
            TextView label =(TextView)row.findViewById(R.id.label);
            label.setText(mArrayList.get(position));
            ImageView icon = (ImageView)row.findViewById(R.id.rowicon);
            icon.setImageResource(R.drawable.icon_phone);
        } else if (position == 2 || position == 6) { // email
            row = inflater.inflate(R.layout.row_iconic, parent, false);
            TextView label =(TextView)row.findViewById(R.id.label);
            label.setText(mArrayList.get(position));
            ImageView icon = (ImageView)row.findViewById(R.id.rowicon);
            icon.setImageResource(R.drawable.icon_email);
        } else if (position == 0 || position == 4) { // section header
            row = inflater.inflate(R.layout.row_header, parent, false);
            TextView label =(TextView)row.findViewById(R.id.label);
            label.setText(mArrayList.get(position));
            label.setBackgroundColor(Color.GRAY);   
        } else if (position == 3) { // section divider
            row = inflater.inflate(R.layout.row_header, parent, false);
            TextView label =(TextView)row.findViewById(R.id.label);
            label.setText(" ");
        }

        return(row);

    }
}
类IconicAdapter扩展了ArrayAdapter{
象似适配器(){
super(ContactTabProfileResource.this,R.layout.row_图标,mArrayList);
}
公共视图getView(int位置、视图转换视图、视图组父视图){
LayoutInflater充气机=getLayoutInflater();
视图行=空;
如果(位置==1 | |位置==5){//phone
行=充气机。充气(R.layout.row_图标,父项,false);
TextView标签=(TextView)row.findViewById(R.id.label);
label.setText(mArrayList.get(position));
ImageView图标=(ImageView)row.findViewById(R.id.rowicon);
icon.setImageResource(R.drawable.icon\u电话);
}如果(位置==2 | |位置==6){//电子邮件
行=充气机。充气(R.layout.row_图标,父项,false);
TextView标签=(TextView)row.findViewById(R.id.label);
label.setText(mArrayList.get(position));
ImageView图标=(ImageView)row.findViewById(R.id.rowicon);
icon.setImageResource(R.drawable.icon_电子邮件);
}如果(位置==0 | |位置==4){//节头
行=充气机。充气(R.layout.row_标题,父项,false);
TextView标签=(TextView)row.findViewById(R.id.label);
label.setText(mArrayList.get(position));
标签.背景颜色(颜色.灰色);
}如果(位置==3){//分段分隔符
行=充气机。充气(R.layout.row_标题,父项,false);
TextView标签=(TextView)row.findViewById(R.id.label);
label.setText(“”);
}
返回(行);
}
}
然后我创建了两个不同的XML布局。row_header.xml用于标题行,row_icogal.xml用于包含图标的非标题行

row_header.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="horizontal"
  android:gravity="right"
>    

  <TextView
    android:id="@+id/label"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:textSize="20sp"
    android:paddingTop="10dp"
    android:paddingBottom="10dp"
    android:paddingRight="10dp"
    android:paddingLeft="10px"
    android:gravity="left"
    android:textStyle="bold"
    />    
</LinearLayout>

row_.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="horizontal"
  android:gravity="right"
>    

  <TextView
    android:id="@+id/label"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:textSize="16sp"
    android:paddingTop="10dp"
    android:paddingBottom="10dp"
    android:paddingRight="10dp"
    android:paddingLeft="44px"
    />  
    <ImageView
    android:id="@+id/rowicon"
    android:layout_width="40dp"
    android:paddingRight="10dp"
    android:paddingTop="10dp"
    android:layout_height="30dp"        
    android:src="@drawable/icon"
    />    
</LinearLayout>


通过多次调用addHeaderView(),可以添加任意数量的标题。在将适配器设置为列表视图之前,您必须这样做。

Android开发人员可能会称之为列表分隔符或副标题(“页眉”和“页脚”仅位于列表的顶部或底部)。如何做到这一点的要点是使用一个ListAdapter,该ListAdapter封装了其他ListAdapter,并且足够聪明,可以为某些行返回标题视图类型并跟踪偏移,或者将这些分隔符视图封装在它们自己的迷你适配器中

看看MarkMurphy的GPL,它采用了第一种方法(基于JeffSharkey的代码),或者他的,然后看


这与iPhone上对智能列表子标题的优雅处理大相径庭,但使用MergeAdapter非常简单,而且只要你仔细考虑适配器内部的情况,就会非常灵活。

如果你想返回不同的布局(例如,项目和标题),你必须使用它。因此,您的适配器代码应该如下所示:

private static final int TYPE_HEADER = 0;
private static final int TYPE_ICONIC = 1;

@Override
public int getViewTypeCount() {
    return 2;   // we have two types, so just return 2
}

@Override
public int getItemViewType(int position) {
    // TODO: return TYPE_HEADER here if this position is a header, otherwise return TYPE_ICONIC
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    // TODO: return the appropriate layout
    // hint: you might call getItemViewType(position) yourself here to know of which type the layout is
}

基本上就是这样。为确保标题不可选择,您可能希望丢弃ArrayAdapter,改用ListAdapter,覆盖标题视图以返回false。;-)

您也可以将其用作示例。它支持“节”和“动作”,其中“节”只是一组“动作”(项目),它们有不可点击和不可选择的项目-标题。“Actions”可以指定
onClick
处理程序,当按下此“action”(如果存在)时将调用该处理程序。它还包含
ImageLoader
,用于从web上获取“操作”的图像。

我可以添加多个标题视图。。。但它们都出现在列表视图的顶部。我想使用标题在ListView中创建节。不确定如何使标题显示在ListView顶部以外的任何位置