Android为ListView的Item设置不同的布局

简介: MainActivity如下: package cc.testlistview;import java.util.ArrayList;import java.

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;
    }
}


 

相关文章
|
7月前
|
XML API Android开发
码农之重学安卓:利用androidx.preference 快速创建一、二级设置菜单(demo)
本文介绍了如何使用androidx.preference库快速创建具有一级和二级菜单的Android设置界面的步骤和示例代码。
216 1
码农之重学安卓:利用androidx.preference 快速创建一、二级设置菜单(demo)
|
5月前
|
ARouter Android开发
Android不同module布局文件重名被覆盖
Android不同module布局文件重名被覆盖
|
7月前
|
移动开发 监控 前端开发
构建高效Android应用:从优化布局到提升性能
【7月更文挑战第60天】在移动开发领域,一个流畅且响应迅速的应用程序是用户留存的关键。针对Android平台,开发者面临的挑战包括多样化的设备兼容性和性能优化。本文将深入探讨如何通过改进布局设计、内存管理和多线程处理来构建高效的Android应用。我们将剖析布局优化的细节,并讨论最新的Android性能提升策略,以帮助开发者创建更快速、更流畅的用户体验。
102 10
|
5月前
|
ARouter Android开发
Android不同module布局文件重名被覆盖
Android不同module布局文件重名被覆盖
277 0
|
6月前
|
Android开发
Android经典实战之Textview文字设置不同颜色、下划线、加粗、超链接等效果
本文介绍了 `SpannableString` 在 Android 开发中的强大功能,包括如何在单个字符串中应用多种样式,如颜色、字体大小、风格等,并提供了详细代码示例,展示如何设置文本颜色、添加点击事件等,助你实现丰富文本效果。
404 3
|
7月前
|
编解码 Android开发
【Android Studio】使用UI工具绘制,ConstraintLayout 限制性布局,快速上手
本文介绍了Android Studio中使用ConstraintLayout布局的方法,通过创建布局文件、设置控件约束等步骤,快速上手UI设计,并提供了一个TV Launcher界面布局的绘制示例。
146 1
|
6月前
|
图形学 iOS开发 Android开发
从Unity开发到移动平台制胜攻略:全面解析iOS与Android应用发布流程,助你轻松掌握跨平台发布技巧,打造爆款手游不是梦——性能优化、广告集成与内购设置全包含
【8月更文挑战第31天】本书详细介绍了如何在Unity中设置项目以适应移动设备,涵盖性能优化、集成广告及内购功能等关键步骤。通过具体示例和代码片段,指导读者完成iOS和Android应用的打包与发布,确保应用顺利上线并获得成功。无论是性能调整还是平台特定的操作,本书均提供了全面的解决方案。
218 0
|
Android开发 iOS开发 C++
Flutter中设置Android的应用名称和图标(android,ios,web)
在前面的几期给大家介绍了flutter的安装以及一些简单的配置,还运行了helloword 那么接下来就带领大家了解如何设置应用名称以及图标
313 0
|
1月前
|
JavaScript 搜索推荐 Android开发
【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
65 8
【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
|
1月前
|
前端开发 Java Shell
【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
179 20
【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex

热门文章

最新文章

  • 1
    Android历史版本与APK文件结构
  • 2
    【01】噩梦终结flutter配安卓android鸿蒙harmonyOS 以及next调试环境配鸿蒙和ios真机调试环境-flutter项目安卓环境配置-gradle-agp-ndkVersion模拟器运行真机测试环境-本地环境搭建-如何快速搭建android本地运行环境-优雅草卓伊凡-很多人在这步就被难倒了
  • 3
    【03】仿站技术之python技术,看完学会再也不用去购买收费工具了-修改整体页面做好安卓下载发给客户-并且开始提交网站公安备案-作为APP下载落地页文娱产品一定要备案-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
  • 4
    【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
  • 5
    【03】微信支付商户申请下户到配置完整流程-微信开放平台创建APP应用-填写上传基础资料-生成安卓证书-获取Apk签名-申请+配置完整流程-优雅草卓伊凡
  • 6
    【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
  • 7
    Cellebrite UFED 4PC 7.71 (Windows) - Android 和 iOS 移动设备取证软件
  • 8
    escrcpy:【技术党必看】Android开发,Escrcpy 让你无线投屏新体验!图形界面掌控 Android,30-120fps 超流畅!🔥
  • 9
    Android实战经验之Kotlin中快速实现MVI架构
  • 10
    即时通讯安全篇(一):正确地理解和使用Android端加密算法
  • 1
    【03】微信支付商户申请下户到配置完整流程-微信开放平台创建APP应用-填写上传基础资料-生成安卓证书-获取Apk签名-申请+配置完整流程-优雅草卓伊凡
    66
  • 2
    android FragmentManager 删除所有Fragment 重建
    25
  • 3
    Android实战经验之Kotlin中快速实现MVI架构
    42
  • 4
    即时通讯安全篇(一):正确地理解和使用Android端加密算法
    42
  • 5
    escrcpy:【技术党必看】Android开发,Escrcpy 让你无线投屏新体验!图形界面掌控 Android,30-120fps 超流畅!🔥
    46
  • 6
    【01】噩梦终结flutter配安卓android鸿蒙harmonyOS 以及next调试环境配鸿蒙和ios真机调试环境-flutter项目安卓环境配置-gradle-agp-ndkVersion模拟器运行真机测试环境-本地环境搭建-如何快速搭建android本地运行环境-优雅草卓伊凡-很多人在这步就被难倒了
    158
  • 7
    Cellebrite UFED 4PC 7.71 (Windows) - Android 和 iOS 移动设备取证软件
    55
  • 8
    【03】仿站技术之python技术,看完学会再也不用去购买收费工具了-修改整体页面做好安卓下载发给客户-并且开始提交网站公安备案-作为APP下载落地页文娱产品一定要备案-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
    73
  • 9
    Android历史版本与APK文件结构
    182
  • 10
    【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
    54