MainActivity如下:

package cc.testlistview;
import java.util.ArrayList;
import java.util.HashMap;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ListView;
import android.app.Activity;
/**
* Demo描述:
* 为ListView的Item设置不同的布局.
* 例如在该例子中ListView的第一个Item显示一张
* 图片,其余的Item都显示文字.
*
* 为了达到此目的需要重写BaseAdapter中的
* 1 getViewTypeCount()和getItemViewType(int position)方法.
* 1.1在getViewTypeCount中指定一共有几种不同的item
* 在此返回2即可.
* 1.2在getItemViewType(int position)中需要依据position的不同
* 返回不同的Type.
* 2 在getView()方法中针对不同的Type为Item设置布局
* 2.1得到当前位置(position)时的Type即代码:
* currentType= getItemViewType(position);
* 2.2依据Type的不同为Item设置布局
*
* 参考资料:
* 1 http://blog.csdn.net/yueyue369/article/details/6115552
* 2 http://blog.sina.com.cn/s/blog_5da93c8f0100wx4v.html
* Thank you very much
*/
public class MainActivity extends Activity {
private ListView mListView;
private HashMap<String, Object> mHashMap;
private ArrayList<HashMap<String, Object>> mArrayList;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
init();
}
private void init(){
mArrayList=new ArrayList<HashMap<String,Object>>();
mListView=(ListView) findViewById(R.id.listview);
addDataForListView();
mListView.setAdapter
(new ListViewAdapter(MainActivity.this, mArrayList, R.layout.othersitem, new String []{"content"}, new int []{R.id.textView}));
mListView.setOnItemClickListener(new ItemClickListenerImpl());
}
private void addDataForListView(){
for (int i = 0; i < 30; i++) {
mHashMap=new HashMap<String, Object>();
mHashMap.put("content", "This is ---> "+i);
mArrayList.add(mHashMap);
}
} private class ItemClickListenerImpl implements OnItemClickListener {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position,long arg) {
System.out.println("OnItemClickListener position="+position); }
}
}

ListViewAdapter如下:

package cc.testlistview;
import java.util.List;
import java.util.Map;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView; public class ListViewAdapter extends BaseAdapter {
private List<? extends Map<String, ?>> mArrayList;
private int resource;
private LayoutInflater mLayoutInflater; private final int TYPE_COUNT=2;
private final int FIRST_TYPE=0;
private final int OTHERS_TYPE=1;
private int currentType;
public ListViewAdapter(Context context,List<? extends Map<String, ?>> data, int resource, String[] from,int[] to) {
this.mArrayList=data;
this.resource=resource;
mLayoutInflater=(LayoutInflater) context.getSystemService(context.LAYOUT_INFLATER_SERVICE);
} @Override
public int getCount() {
if (mArrayList==null) {
return 0;
} else {
return (mArrayList.size()+1);
} } @Override
public Object getItem(int position) {
if (mArrayList==null) {
return null;
} else {
if (position>0) {
return mArrayList.get(position-1);
} else {
return mArrayList.get(position+1);
}
}
} @Override
public long getItemId(int position) {
return position;
} ///////////////////////////////////////////////////////
@Override
public int getViewTypeCount() {
return TYPE_COUNT;
} @Override
public int getItemViewType(int position) {
if (position==0) {
return FIRST_TYPE;
} else {
return OTHERS_TYPE;
}
}
/////////////////////////////////////////////////////// @Override
public View getView(int position, View convertView, ViewGroup parent) {
View firstItemView = null;
View othersItemView=null;
//获取到当前位置所对应的Type
currentType= getItemViewType(position);
System.out.println("type="+currentType);
if (currentType== FIRST_TYPE) {
firstItemView = convertView;
FirstItemViewHolder firstItemViewHolder=null;
if (firstItemView==null) {
System.out.println("firstItemView==null ");
firstItemView = mLayoutInflater.inflate(R.layout.firstitem,null);
firstItemView.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View view) {
System.out.println("=====click first item=======");
}
});
firstItemViewHolder=new FirstItemViewHolder();
firstItemViewHolder.imageView=(ImageView) firstItemView.findViewById(R.id.imageView);
firstItemView.setTag(firstItemViewHolder); } else {
System.out.println("firstItemView!=null ");
System.out.println("111 getClass="+firstItemView.getTag().getClass().toString());
firstItemViewHolder=(FirstItemViewHolder) firstItemView.getTag();
} if (firstItemViewHolder.imageView!=null) {
firstItemViewHolder.imageView.setImageResource(R.drawable.ic_launcher);
} convertView=firstItemView; } else {
othersItemView = convertView;
OthersViewHolder othersViewHolder=null;
if (othersItemView==null) {
System.out.println("othersItemView==null ");
othersItemView = mLayoutInflater.inflate(R.layout.othersitem,null);
othersViewHolder=new OthersViewHolder();
othersViewHolder.textView=(TextView) othersItemView.findViewById(R.id.textView);
othersItemView.setTag(othersViewHolder);
} else {
System.out.println("othersItemView!=null ");
System.out.println("222 getClass="+othersItemView.getTag().getClass().toString());
othersViewHolder=(OthersViewHolder) othersItemView.getTag();
} if (mArrayList!=null) {
if (othersViewHolder.textView!=null) {
othersViewHolder.textView.setText((String)(mArrayList.get(position-1).get("content")));
} } convertView=othersItemView; } return convertView;
} //第一个Item的ViewHolder
private class FirstItemViewHolder{
ImageView imageView;
} //除第一个Item以外其余Item的ViewHolder
private class OthersViewHolder{
TextView textView;
}
}

Android为ListView的Item设置不同的布局的更多相关文章

  1. Android 实现ListView中Item被单击后背景色保持高亮

    今天为了解决一个需求,就是我有一个slidingDrawer,里面是一个ListView.然后,单击其中的Item,默认只是显示一个橙色背景后就恢复了.客户便有着个需求,需要单击这个Item的背景高亮 ...

  2. android中listview的item滑动删除效果(已解决listview点击问题)

    领导看到iphone上tableview有个滑动删除的效果,要求在android上也实现,搜了下资料,实现起来比较简单,可弄到后面,居然不能点击了,把一篇文章中的代码修改了一下,捣鼓了一番,搞定,下面 ...

  3. Android自定义ListView的Item无法响应OnItemClick的解决办法

     转: 如果你的自定义ListViewItem中有Button或者Checkable的子类控件的话,那么默认focus是交给了子控件,而ListView的Item能被选中的基础是它能获取Focus,也 ...

  4. Android自定义ListView的Item无法响应OnItemClick的解决办法(转)

    原文链接:http://www.linuxidc.com/Linux/2011-09/43205.htm 如果你的自定义ListViewItem中有Button或者Checkable的子类控件的话,那 ...

  5. android 在 ListView 的 item 中插入 GridView 仿微信朋友圈图片显示。

    转载请声明出处(http://www.cnblogs.com/linguanh/) 先上张效果图: 1,思路简述 这个肯定是要重写 baseAdapter的了,这里我分了两个数据适配器,一个是自定义的 ...

  6. Android学习---ListView和Inflater的使用,将一个布局文件转化为一个对象

    本文将介绍ListView和Inflater的使用,将接上一篇文章内容. 一.什么是ListView? 在android开发中ListView是比较常用的控件,ListView 控件可使用四种不同视图 ...

  7. Android开发-Listview中显示不同的视图布局

    1. 使用场景 在重写ListView的BaseAdapter时,我们常常在getView()方法中复用convertView,以提高性能.convertView在Item为单一的同种类型布局时,能够 ...

  8. Android给listview的item设定高度

    在item的layout文件中,用android:layout_height设置item的高度.运行,高度设置无效. 解决办法: 给item设定minHeight,即可. -------------- ...

  9. Android关于ListView中item与控件抢夺焦点的那些事

    在开发中,listview可以说是我们使用最频繁的控件之一了,但是关于listview的各种问题也是很多.当我们使用自定义布局的Listview的时候,如果在item的布局文件里面存在Button或者 ...

随机推荐

  1. 【POJ2886】【线段树】Who Gets the Most Candies?

    Description N children are sitting in a circle to play a game. The children are numbered from 1 to N ...

  2. ICE学习第三步-----Slice语言

    ICE:Slice语言(一)-编译 Introduce简介 Slice(Specification language for ice)是分离对象和对象的实现的基础的抽象机制.Slice在客户端和服务器 ...

  3. java.io.serializable

    为什么要实现 java.io.serializable? 简单点:“好处就是将来项目如果要做集群的话,就实现java.io.serializable接口”

  4. PHP数据库

    目录 1.创建数据库连接 2.创建数据库 3.选择数据库 4.设置当前连接使用的字符编码 5.创建表 6.插入数据 7.取得数据查询结果 8.关闭连接 1.创建数据库连接 //mysql_connec ...

  5. Python 基础-python函数

    函数    1.def    2.命名    3.函数体    4.return 返回值 def get_return(): a = 1 return a 函数参数有 形参和实参    定义几个形参就 ...

  6. nodebb在阿里云主机部署过程

    1.在centos上安装nodejswget http://nodejs.org/dist/v0.8.9/node-v0.8.9.tar.gztar zxvf node-v0.8.9.tar.gzcd ...

  7. Django Web在Apache上的部署

    1. 安装配置Apache 2. 安装wsgi_mod模块 3. 开放相应端口 vim /etc/sysconfig/iptables # Firewall configuration written ...

  8. NandFlash

    一.概述 1.NandFlash NAND结构能提供极高的单元密度,可以达到高存储密度,比如能达到256M,并且写入和擦除的速度也很快.应用NAND的困难在于flash的管理需要特殊的系统接口. 2. ...

  9. 转:Google技术开发指南:给大学生自学的建议

    原文来自于:http://blog.jobbole.com/80621/ 技术开发指南 想要成为成功的软件工程师,必须拥有坚实的计算机科学的基础.本指南针对大学生,给出一条自学途径,让学生以科班和非科 ...

  10. [BZOJ - 2463] [中山市选2009] 谁能赢呢?【“博弈论”】

    题目链接:BZOJ - 2463 题目分析 这道题的题解是,由于两人都采取最优策略,所以最后一定所有格子都会被走到.(Why..表示不懂..哪位神犇可以给我讲一下QAQ) Upd:半群的神犇告诉我,并 ...