ListView中有两个可以用来让ListView可以在视图中显示多种布局的方法,分别是getItemType和getViewTypeCount

其中

getItemViewType返回的是有参数position所决定的的view的id
    getViewTypeCount,顾名思义,就是返回不同布局的数目

接下来我们要做的就是在getView方法中根据不同的itemType来创建正确的convertView

话不多说,先上图

主要代码:

Activity

public class MainActivity extends Activity {

    @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
} private void initView() {
ListView listView = (ListView) findViewById(R.id.listview);
listView.setAdapter(new MySeparatorListAdapter(initData()));
} private List<ListData> initData() {
List<ListData> data = new ArrayList<MainActivity.ListData>();
for(int i = 0; i < 30; i ++)
data.add(new ListData("标题:" + i, "内容:" + i, "作者:" + i));
return data;
}
}

Adapter类

class MySeparatorListAdapter extends BaseAdapter {
private static final int TYPE_MAIN = 0;
private static final int TYPE_SEPARATOR = 1;
private static final int TYPE_COUNT = 2; private List<ListData> mData;
private LayoutInflater mInflater; private TreeSet mSeparatorsSet = new TreeSet(); public MySeparatorListAdapter(List<ListData> data) {
mInflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
mData = data;
setSeparator();
} @SuppressWarnings("unchecked")
private void setSeparator() {
int index = 0;
for(int i = 0, n = mData.size(); i < n; i ++) {
if(i % 3 == 0) {
//保存分界位置信息
mSeparatorsSet.add(i + index);
mData.add(i + index, new ListData("分界" + index, null, null));
index ++;
}
}
notifyDataSetChanged();
} @Override
public int getItemViewType(int position) {
return mSeparatorsSet.contains(position) ? TYPE_SEPARATOR : TYPE_MAIN;
} @Override
public int getViewTypeCount() {
return TYPE_COUNT;
} @Override
public int getCount() {
return mData.size();
} @Override
public long getItemId(int position) {
return position;
} @Override
public ListData getItem(int position) {
return mData.get(position);
} @Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder = null;
int type = getItemViewType(position);
if (convertView == null) {
holder = new ViewHolder();
switch (type) {
case TYPE_MAIN:
convertView = mInflater.inflate(R.layout.music_hot_review_item, null);
holder.titleView = (TextView)convertView.findViewById(R.id.music_hot_review_musicname);
holder.contentView = (TextView)convertView.findViewById(R.id.music_hot_review_review);
holder.authorView = (TextView)convertView.findViewById(R.id.music_hot_review_username);
break;
case TYPE_SEPARATOR:
convertView = mInflater.inflate(R.layout.separator_item, null);
holder.titleView = (TextView)convertView.findViewById(R.id.separetor_title);
break;
}
convertView.setTag(holder);
} else {
holder = (ViewHolder)convertView.getTag();
}
switch (type) {
case TYPE_MAIN:
holder.titleView.setText(mData.get(position).getTitle().toString());
holder.contentView.setText(mData.get(position).getContent().toString());
holder.authorView.setText(mData.get(position).getAuthor().toString());
break;
case TYPE_SEPARATOR:
holder.titleView.setText(mData.get(position).getTitle().toString());
break;
}
return convertView;
}
}

xml代码:

主要布局:music_hot_review_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:background="@drawable/list_rect_selector"
android:orientation="vertical" > <RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent" > <ImageView
android:id="@+id/music_hot_review_imageview"
android:layout_width="70dp"
android:layout_height="70dp"
android:layout_marginLeft="5dp"
android:layout_marginTop="5dp"
android:scaleType="centerCrop"
android:src="@drawable/music_image_default" /> <TextView
android:id="@+id/music_hot_review_musicname"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="10dp"
android:layout_marginTop="5dp"
android:layout_toRightOf="@id/music_hot_review_imageview"
android:ellipsize="marquee"
android:marqueeRepeatLimit="marquee_forever"
android:singleLine="true"
android:text="我好想你"
android:textColor="@color/font_color"
android:textSize="18sp" /> <TextView
android:id="@+id/music_hot_review_username"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/music_hot_review_musicname"
android:layout_marginLeft="13dp"
android:layout_marginTop="2dp"
android:layout_toRightOf="@id/music_hot_review_imageview"
android:text="居来提"
android:textColor="@color/font_color"
android:textSize="16sp" /> <TextView
android:id="@+id/music_hot_review_review"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@id/music_hot_review_username"
android:layout_marginLeft="13dp"
android:layout_marginRight="5dp"
android:layout_marginTop="2dp"
android:layout_toRightOf="@id/music_hot_review_imageview"
android:paddingBottom="10dp"
android:text="dsahdkasdh"
android:textColor="@color/font_color"
android:textSize="15sp" />
</RelativeLayout> </LinearLayout>

分界布局: separator_item.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="5dp" > <TextView
android:id="@+id/separetor_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:textSize="20sp"
android:textColor="@color/my_green"
android:text="分界"
/> </RelativeLayout>

本文内容参考:http://www.cnblogs.com/xiaowenji/archive/2010/12/08/1900579.html

Listview getItemViewType的使用的更多相关文章

  1. Android之ListView的getItemViewType和getViewTypeCount

    PS:感觉这两个方法其实还是很容易理解的,也算是给我其他两个朋友写的吧,帮他们搞清楚这两个方法的用法和概念.同时还有一些小细节问题需要注意. 学习内容: 1.getItemViewType和getVi ...

  2. android listview getviewtypecount和getItemViewType

    package newdemo.jeno.listviewdemo; import android.app.Activity;import android.os.Bundle;import andro ...

  3. ListView getView中放置多个item和getItemViewType的用法

    ListView 和 Adapter 的基础 工作原理: ListView 针对List中每个item,要求 adapter “给我一个视图” (getView). 一个新的视图被返回并显示 如果我们 ...

  4. Android ListView Adapter的getItemViewType和getViewTypeCount多种布局

     <Android ListView Adapter的getItemViewType和getViewTypeCount多种布局> 在Android的ListView中.假设在一个Lis ...

  5. listview下拉刷新和上拉加载更多的多种实现方案

    listview经常结合下来刷新和上拉加载更多使用,本文总结了三种常用到的方案分别作出说明. 方案一:添加头布局和脚布局        android系统为listview提供了addfootview ...

  6. 【腾讯Bugly干货分享】跨平台 ListView 性能优化

    本文来自于腾讯Bugly公众号(weixinBugly),未经作者同意,请勿转载,原文地址:https://mp.weixin.qq.com/s/FbiSLPxFdGqJ00WgpJ94yw 导语 精 ...

  7. Android关于listView的BaseAdapter以及getView的三级优化

    1.4个重写方法的含义 自定义Adapter继承自BaseAdapter(通用适配器)   getCount(); getItem(); getItemId(); getViewTypaCount() ...

  8. ListView之多种类型Item

    一.概述 一般而言,listview每个item的样式是一样的,但也有很多应用场景下不同位置的item需要不同的样式. 拿微信举例,前者的代表作是消息列表,而后者的典型则是聊天会话界面. 本文重点介绍 ...

  9. Android之ListView性能优化——使用ConvertView和ViewHolder

    使用ConvertView和ViewHolder的优化是针对ListView的Adapter(BaseAdapter)的.这种优化的优点如下: 1)重用了ConveertView,在很大程度上减少了内 ...

随机推荐

  1. Quick 3.3 的代码资源加密

    http://cn.cocos2d-x.org/tutorial/show?id=1507 http://cn.cocos2d-x.org/tutorial/show?id=1447 http://b ...

  2. Oracle 之 配置HugePages内存

    HugePages是通过使用大页内存来取代传统的4kb内存页面,使得管理虚拟地址数变少,加快了从虚拟地址到物理地址的映射以及通过摒弃内存页面的换入换出以提高内存的整体性能.尤其是对于8GB以上的内存以 ...

  3. git clone遇到的[ssh: connect to host github.com port 22]

    起因 在学习递归的时候,对汉诺塔小研究了一番,参考网上写了个demo,后面就想同步到github. 过程 这台电脑是新电脑,所以需要先本地生成ssh key:ssh-keygen -t rsa -C ...

  4. 关于tab的切换之共用html页面,而引发的页面跳转错乱问题

    在一个项目中的同一个模块中,有多个tab(并且多个tab对应的页面结构完全一样),tab的每次切换,不同tab调用不同的接口,利用一个switch进行判断,根据当前的类型去调用不同的接口,返回不同数据 ...

  5. (转)Inno Setup入门(五)——添加readme文件

    本文转载自:http://blog.csdn.net/yushanddddfenghailin/article/details/17250771 这个实现起来很简单,就是在[files]段中的某个预先 ...

  6. 以太坊客户端Geth命令用法

    命令用法 geth [选项] 命令 [命令选项] [参数…] 命令: account 管理账户attach 启动交互式JavaScript环境(连接到节点)bug 上报bug Issuesconsol ...

  7. python--logging库学习_第一波

    简单使用 #!/usr/local/bin/python # -*- coding:utf-8 -*- import logging logging.debug('debug message') lo ...

  8. NFS的安装以及windows/linux挂载linux网络文件系统NFS

    1.创建linux的NFS服务端安装centos6.4,关闭防火墙/etc/init.d/iptables status yum install nfs-utils rpcbind [root@lin ...

  9. 第八章 Health Check

    8.1 默认的健康检查 每个容器启动时会执行一个进程,此进程由Dockerfile的CMD或ENTRYPOINT指定.如果进程退出时返回码非零,则认为容器发生故障,K8s就会根据restartPoli ...

  10. Repeater,ItemDataBound事件,获取绑定列的值,给指定列添加js方法

    protected void rp_bf_ItemDataBound(object sender, RepeaterItemEventArgs e) { if (e.Item.ItemType == ...