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. confluence的权限管理

    上一篇解讲如何破解,安装confluence5.8.10,这次主要是看权限管理的实现.因为公司对知识的管理不仅是简单的分享,还要求不同权限的人看到不同的内容,所以在一开始就需要对权限这一块有所了解,以 ...

  2. python - zipfile

    参考:http://www.cnblogs.com/sislcb/archive/2008/11/28/1342822.html zipfile - python处理zip文件的压缩与解压 ZipFi ...

  3. 20款jquery下拉导航菜单特效代码分享

    20款jquery下拉导航菜单特效代码分享 jquery仿京东商城左侧分类导航下拉菜单代码 jQuery企业网站下拉导航菜单代码 jQuery css3黑色的多级导航菜单下拉列表代码 jquery响应 ...

  4. 一个小白对Arguments的理解

    1.Arguments是一个类似数组的实参队列,译为:论据,论点,姑且译作参数(实参): 2.Arguments与形参保持不同的存储空间,只有当形参被赋值之后两者才会相等 3.传说在严格模式下函数内自 ...

  5. c#的异或运算符

    int a = 5; int b = 30; Console.WriteLine(a^b); Console.ReadKey();  输出结果是27 这是因为 5的二进制是0000 010130的二进 ...

  6. [开源]jquery-ajax-cache:快速优化页面ajax请求,使用localStorage缓存请求

    项目:jquery-ajax-cache 地址:https://github.com/WQTeam/jquery-ajax-cache     最近在项目中用到了本地缓存localStorage做数据 ...

  7. ThinkPHP 自动验证与自动填充无效可能的原因

    原文链接:http://www.5idev.com/p-thinkphp_validate_auto_Invalid.shtml 自动验证与自动填充是在使用ThinkPHP时经常用到的功能,但偶尔会遇 ...

  8. 再次探究Android ListView缓存机制

    概述 虽然现在5.0后Google推出了RecycleView,但在5.0 Lollipop普及前Listview仍会被广泛使用,所以打算再次探究一下Listview的源码,了解一下Listview ...

  9. IOS“多继承”

    转自念茜的博客: 当单继承不够用,很难为问题域建模时,我们通常都会直接想到多继承.多继承是从多余一个直接基类派生类的能力,可以更加直接地为应用程序建模.但是Objective-C不支持多继承,由于消息 ...

  10. Bow模型(解释的很好)

    Bag-of-words model (BoW model) 最早出现在NLP和IR领域. 该模型忽略掉文本的语法和语序, 用一组无序的单词(words)来表达一段文字或一个文档. 近年来, BoW模 ...