三种方式

目前为止有三种方法让Listview现实多个样式

  • 最简单最常用的,通过addHeaderView或addFooterView,但是只能在首尾添加
  • 较麻烦但正规的方式,通过getViewTypeCount[View有多少个样式]和getItemViewType[这个View是哪个样式]方法设置
  • 较简单但不正规的方式,通过判断poison的值加载不同的布局,但这种方式可能有隐患[从代码中可以看出很不规范]
addHeaderView方式
  • 当listview需要添加headerview时,可以通过调用listview的addHeaderView(headView)或addHeaderView(headView, null, false) 方法,后一个可以控制header是否可以被selected
  • addHeaderView方法必须放在listview.setAdapter前面,否则会报错。原因是调用setAdapter方法时会判断是否已经添加header,如果已经添加则会生成一个新的tempAdapter,这个新的tempAdapter包含我们设置的adapter所有内容(包含header和footer),所以当我们在给listview添加了header后在程序中调用listview.getAdapter时返回的是tempAdapter而不是我们通过setAdapter传进去的adapter。如果没有设置adapter则tempadapter与我们自己的adapter是一样的。
  • listview.getadapter().getcount()方法返回值会比我们预期的要大,原因是添加了header。
标准方式:
  • getViewTypeCount:返回的是你有几种类型的样式(返回不同布局的数目)
  • getItemViewType:返回值代表的是某一个样式的 Type(是一个需要我们自己定义的,用于区分不同样式的int类型的值),参数position所决定的的view的id


布局-样式

    

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#cfc"
    android:orientation="horizontal"
    android:padding="1dp" >
    <ListView
        android:id="@+id/lv1"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="1"
        android:descendantFocusability="afterDescendants"
        android:listSelector="@android:color/transparent" />
    <ListView
        android:id="@+id/lv2"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_marginLeft="3dp"
        android:layout_weight="1"
        android:descendantFocusability="afterDescendants"
        android:listSelector="@android:color/transparent" />
    <ListView
        android:id="@+id/lv3"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_marginLeft="3dp"
        android:layout_weight="1"
        android:descendantFocusability="afterDescendants"
        android:listSelector="@android:color/transparent" />

</LinearLayout>


<?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="wrap_content"
    android:background="#80f8"
    android:gravity="clip_vertical" >
    <TextView
        android:id="@+id/holder1_title"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:ellipsize="end"
        android:padding="5dp"
        android:singleLine="true"
        android:text="大标题"
        android:textColor="#f00"
        android:textSize="15sp" />

</LinearLayout>


<?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="30dp"
    android:background="#ffffff"
    android:gravity="center_vertical"
    android:orientation="horizontal" >
    <ImageView
        android:id="@+id/holder2_iv"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/ic_launcher" />
    <TextView
        android:id="@+id/holder2_title"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_marginLeft="5dp"
        android:gravity="center_vertical"
        android:text="小标题"
        android:textColor="#00f"
        android:textSize="13sp" />

</LinearLayout>


代码-Activity

import java.util.ArrayList;

import java.util.List;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.ImageView;
import android.widget.AbsListView.LayoutParams;
import android.widget.ListView;
import android.widget.TextView;
import com.example.hjfg.R;
public class MainActivity extends Activity {
    private ListView lv1;
    private ListView lv2;
    private ListView lv3;
    private List<MyBean> mList1;
    private List<ViewItem> mList2;
    private List<MyBean> mList31;
    private List<MyBean> mList32;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        lv1 = (ListView) findViewById(R.id.lv1);
        lv2 = (ListView) findViewById(R.id.lv2);
        lv3 = (ListView) findViewById(R.id.lv3);
        initData1();
        initData2();
        initData3();
        lv1.setAdapter(new MyAdapter1(this, mList1));//addHeaderView要放在setAdapter之前,而addFooterView放在前后都可以
        lv2.setAdapter(new MyAdapter2(this, mList2));
        lv3.setAdapter(new MyAdapter3(this, mList31, mList32));
    }
    private void initData1() {
        mList1 = new ArrayList<MyBean>();
        for (int i = 0; i < 20; i++) {
            mList1.add(new MyBean(("包青天" + i), R.drawable.ic_launcher));
        }
        //给ListView添加头尾,其中Adapter不需任何改变
        TextView mTextView = new TextView(this);
        mTextView.setText("我是【先】添加的的头部");
        mTextView.setBackgroundColor(0xff4EEE94);
        ImageView mImageView = new ImageView(this);
        mImageView.setImageResource(R.drawable.ic_launcher);
        lv1.addHeaderView(mTextView);//添加以后,listView 的position = 0 的位置对应的是此mTextView,他和其他item是完全等价的
        lv1.addHeaderView(mImageView);
        lv1.setHeaderDividersEnabled(true);//控制头部是否显示分割线。默认为true
        //最后加一个透明的控件,那么最后那条分割线【可能】就出来了
        View footerView = new View(this);
        LayoutParams layoutParams = new LayoutParams(LayoutParams.MATCH_PARENT, 50);
        footerView.setBackgroundColor(0x00112233);//透明
        footerView.setLayoutParams(layoutParams);
        lv1.addFooterView(footerView);
    }
    private void initData2() {
        mList2 = new ArrayList<ViewItem>();
        for (int i = 0; i < 30; i++) {
            ViewItem item;
            if (i % 5 == 0 || i == 3) item = new ViewItem(0, "大标题 " + i);
            else item = new ViewItem(1, "内容 " + i, R.drawable.ic_launcher);
            mList2.add(item);
        }
    }
    private void initData3() {
        mList31 = new ArrayList<MyBean>();
        mList32 = new ArrayList<MyBean>();
        for (int i = 0; i < 18; i++) {
            mList31.add(new MyBean(("包青天" + i), R.drawable.ic_launcher));
            if (i < 12) mList32.add(new MyBean(("白乾涛" + i), R.drawable.icon));
        }
    }

}


代码-Adapter1

import java.util.List;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;
import com.example.hjfg.R;
public class MyAdapter1 extends BaseAdapter {
    private Context mContext;
    private List<MyBean> mList;
    private ViewHolder mViewHolder;
    private MyBean mBean;
    public MyAdapter1(Context context, List<MyBean> list) {
        this.mContext = context;
        this.mList = list;
    }
    @Override
    public int getCount() {
        return mList.size();
    }
    @Override
    public Object getItem(int position) {
        return mList.get(position);
    }
    @Override
    public long getItemId(int position) {
        return position;
    }
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        if (convertView != null) {
            mViewHolder = (ViewHolder) convertView.getTag();
        } else {
            convertView = LayoutInflater.from(mContext).inflate(R.layout.item, null);
            mViewHolder = new ViewHolder();
            mViewHolder.iv_head = (ImageView) convertView.findViewById(R.id.holder2_iv);
            mViewHolder.tv_name = (TextView) convertView.findViewById(R.id.holder2_title);
            convertView.setTag(mViewHolder);
        }
        mBean = mList.get(position);
        mViewHolder.iv_head.setImageResource(mBean.getId());
        mViewHolder.tv_name.setText(mBean.getName());
        return convertView;
    }
    public static class ViewHolder {
        public ImageView iv_head;// 头像
        public TextView tv_name;// 名字
    }

}


代码-Adapter2

import java.util.List;

import android.content.Context;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;
import com.example.hjfg.R;
public class MyAdapter2 extends BaseAdapter {
    private Context context;
    private List<ViewItem> mList;
    private Holder1 holder1;
    private Holder2 holder2;
    public MyAdapter2(Context context, List<ViewItem> list) {
        this.context = context;
        mList = list;
    }
    //**********************************************************************************************************
    @Override
    public int getCount() {
        return mList.size();
    }
    @Override
    public Object getItem(int position) {
        return mList.get(position);
    }
    //重写方法一:返回值代表的是某一个样式的 Type(是一个需要我们自己定义的,用于区分不同样式的int类型的值)
    @Override
    public int getItemViewType(int position) {
        return mList.get(position).getType();
    }
    //重写方法一:返回的是你有几种类型的样式
    @Override
    public int getViewTypeCount() {
        return 2;
    }
    @Override
    public long getItemId(int paramInt) {
        return paramInt;
    }
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        int type = getItemViewType(position);
        if (convertView == null) {
            //选择某一个样式
            switch (type) {
            case ViewItem.ITEM_FIRST:
                convertView = View.inflate(context, R.layout.head, null);
                holder1 = new Holder1();
                holder1.holder1_title = (TextView) convertView.findViewById(R.id.holder1_title);
                holder1.holder1_title.setText(mList.get(position).getTitle());
                convertView.setTag(holder1);
                break;
            case ViewItem.ITEM_SECOND:
                convertView = View.inflate(context, R.layout.item, null);
                holder2 = new Holder2();
                holder2.holder2_title = (TextView) convertView.findViewById(R.id.holder2_title);
                holder2.holder2_iv = (ImageView) convertView.findViewById(R.id.holder2_iv);
                holder2.holder2_title.setText(mList.get(position).getTitle());
                holder2.holder2_iv.setImageResource(mList.get(position).getId());
                convertView.setTag(holder2);
                break;
            default:
                break;
            }
        } else {
            switch (type) {
            case ViewItem.ITEM_FIRST:
                holder1 = (Holder1) convertView.getTag();
                holder1.holder1_title.setText(mList.get(position).getTitle());
                break;
            case ViewItem.ITEM_SECOND:
                holder2 = (Holder2) convertView.getTag();
                holder2.holder2_title.setText(mList.get(position).getTitle());
                break;
            default:
                break;
            }
        }
        return convertView;
    }
    //***********************************************************************************************************
    //复用convertView
    private class Holder1 {
        TextView holder1_title;
    }
    private class Holder2 {
        TextView holder2_title;
        ImageView holder2_iv;
    }

}


代码-Adapter3

import java.util.List;

import com.example.hjfg.R;
import android.content.Context;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.RelativeLayout;
import android.widget.TextView;
public class MyAdapter3 extends BaseAdapter {
    private Context mContext;
    private List<MyBean> mList1;
    private List<MyBean> mList2;
    private ViewHolder holder;
    private MyBean mBean;
    public MyAdapter3(Context context, List<MyBean> list1, List<MyBean> list2) {
        mContext = context;
        mList1 = list1;
        mList2 = list2;
    }
    //************************************************************************************************************
    @Override
    public int getCount() {
        return mList1.size() + 1 + mList2.size() + 1;
    }
    @Override
    public Object getItem(int position) {
        return null;
    }
    @Override
    public long getItemId(int position) {
        return 0;
    }
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        //标题******************************************************************************************************
        if (position == 0) {
            View view = View.inflate(mContext, R.layout.head, null);
            TextView tv = (TextView) view.findViewById(R.id.holder1_title);
            tv.setText("包青天有" + mList1.size() + "个");
            return view;
        } else if (position == (mList1.size() + 1)) {
            View view = View.inflate(mContext, R.layout.head, null);
            TextView tv = (TextView) view.findViewById(R.id.holder1_title);
            tv.setText("白乾涛有" + mList2.size() + "个");
            return view;
        }
        //内容******************************************************************************************************
        holder = new ViewHolder();//因为数据结构相同,所以可以共同利用缓存,否则只能单独利用缓存
        if (position <= mList1.size()) {
            int newposition = position - 1;
            mBean = mList1.get(newposition);
        } else if (position > mList1.size() + 1) {
            int newposition = position - 1 - mList1.size() - 1;
            mBean = mList2.get(newposition);
        }
        if (convertView != null && convertView instanceof RelativeLayout) { // 不仅需要检查是否为空,还要判断是否是合适的类型
            holder = (ViewHolder) convertView.getTag();
        } else {
            convertView = View.inflate(mContext, R.layout.item, null);
            holder = new ViewHolder();
            holder.iv_icon = (ImageView) convertView.findViewById(R.id.holder2_iv);
            holder.tv_name = (TextView) convertView.findViewById(R.id.holder2_title);
            convertView.setTag(holder);
        }
        holder.iv_icon.setImageResource(mBean.getId());
        holder.tv_name.setText(mBean.getName());
        return convertView;
    }
    //*********************************************************************************************************
    private static class ViewHolder {
        TextView tv_name;
        ImageView iv_icon;
    }

}


代码-bean

public class MyBean {

    private String name;
    private int id;
    public MyBean(String name, int id) {
        this.name = name;
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public int getId() {
        return id;
    }

}


// 封装每个条目的数据数据
public class ViewItem {
    public static final int ITEM_FIRST = 0;//第一个样式
    public static final int ITEM_SECOND = 1;//第二个样式
    private int type;//记录是哪种样式
    private String title;//标题
    private int id;//图片,仅第二个样式可以获取图片
    public ViewItem(int type, String str) {
        this.type = type;
        title = str;
    }
    public ViewItem(int type, String str, int id) {
        this.type = type;
        title = str;
        this.id = id;
    }
    public String getTitle() {
        return title;
    }
    public int getId() {
        if (type == ITEM_SECOND) return id;
        else throw new RuntimeException("哥们是大标题,没有ID");
    }
    public int getType() {
        return type;
    }

}


附件列表

复杂 Listview 显示 多个样式的更多相关文章

  1. Android ListView显示不同样式的item

    先look图 我们再使用listview时,listview的item大多时候都是一种样式,在很多app中也很常见,但有时候根据需求,可能数据的数量不一样,同个类型的数据显示的位置不同,亦或者有的it ...

  2. 转 wince程序 中使用Listview显示图标问题 (C#) .

    思路: 1.窗体控件:lstaqgl [Listview控件名称]  imageList1[ImageList控件] 2.  图片路径添加到—imageList1——Listview显示图片从 ima ...

  3. Android在ListView显示图片(重复混乱闪烁问题)

    Android在ListView显示图片(重复混乱闪烁问题) 1.原因分析 ListView item缓存机制: 为了使得性能更优,ListView会缓存行item(某行相应的View). ListV ...

  4. ScrollView嵌套ListView显示不完全、嵌套TextView不能滚动解决办法

    目录: 一.情景说明 二.最初做法 三.解决办法 一.情景说明 1.情景       最近项目刚好有一个需求,需要在一个界面中用ScrollView嵌套一个滚动的TextView和一个listView ...

  5. android listView多层嵌套listView显示不全问题

    最近在做项目,需要用到listVIew多层嵌套listVIew的需求,先发现已下两个处理办法比较好用 第一种: public class ListViewNesting extends ListVie ...

  6. 解决ScrollView中包含ListView,导致ListView显示不全

    ScrollView 中包含 ListView 的问题 : ScrollView和ListView会冲突,会导致ListView显示不全 <?xml version="1.0" ...

  7. Android 自定义 ListView 显示网络上 JSON 格式歌曲列表

    本文内容 环境 项目结构 演示自定义 ListView 显示网络上 JSON 歌曲列表 参考资料 本文最开始看的是一个国人翻译的文章,没有源代码可下载,根据文中提供的代码片段,自己新建的项目(比较可恶 ...

  8. Android下用程序的方法为ListView设置分割线Divider样式

    使用XML的时候可以使用android:divider属性为ListView设置分割线的样式(颜色或者资源文件),而在Java代码中默认提供的方法 listView.setDivider() 却只支持 ...

  9. weex 数据绑定,动态控制组件的显示内容及样式

    无论的原生开发还是weex开发,经常会需要我们对一些组件/控件动态赋值,在原生中,我们大家都知道,对控件setText就可以了,那么在weex中呢,我们需要怎么做呢,其实很简单,几行代码就可以搞定!首 ...

随机推荐

  1. 跟我学android-Activity介绍

    Activity是android四大组件之一,activity 可以看成是一个屏幕,用户可以在这里做一些操作.activity通常都是满屏的,但也可以小于屏幕而浮于其它窗口之上,比如把activity ...

  2. Python异常的使用

    伪代码: try: 出错部分的代码...... except Exception as e: print '404网页' #Exception是所有错误类型的父类,包括所有出错信息 finally: ...

  3. 用OpenGL简单编写的一个最简单贪吃蛇游戏

    刚学OpenGL的时候,写的一个最简单的贪吃蛇游戏代码 如下: //贪吃蛇游戏 #include<stdio.h> #include<stdlib.h> #include< ...

  4. 嵌入式 现已发展为 IT行业的主流——高薪,且人才缺乏

    嵌入式 现已发展为 IT行业的主流——高薪,且人才缺乏 硅谷芯微技术中心,注重实践操作,以实际项目带学员,让学员真正学到东西,达到企业用人标准,有兴趣的,可以前来了解,给自己多一个选择的机会,可以多家 ...

  5. python urllib2

    http://my.oschina.net/duhaizhang/blog/69883

  6. hdu 2197 本原串

    http://acm.hdu.edu.cn/showproblem.php?pid=2197 长度为n的01串有2的n次方个,再减去不符合要求的.不符合要求的字符串就是长度为n的约数的字符串. 递归处 ...

  7. poj Organize Your Train part II

    http://poj.org/problem?id=3007 #include<cstdio> #include<algorithm> #include<cstring& ...

  8. 来晚了--SALTSTACK要弄起

    PUPPET就算了,我多少都有PYTHON基础,还是专SALTSTACK吧. 今天小玩玩,以后深入.

  9. UOJ 52 元旦激光炮

    http://uoj.ac/problem/52 题意:每次可以得到3个序列中 思路:每次分别取出三个序列的K/3长度的位置,取最小的那个,然后每次减掉它,总复杂度是Nlog3N #include & ...

  10. EMS-keil C51常用错误

    1. LAB100.C(12): error C216: subscript on non-array or too many dimensions 原程序如下: #include <reg51 ...