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


 

相关文章
|
17天前
|
XML API Android开发
码农之重学安卓:利用androidx.preference 快速创建一、二级设置菜单(demo)
本文介绍了如何使用androidx.preference库快速创建具有一级和二级菜单的Android设置界面的步骤和示例代码。
46 1
码农之重学安卓:利用androidx.preference 快速创建一、二级设置菜单(demo)
|
16天前
|
移动开发 监控 前端开发
构建高效Android应用:从优化布局到提升性能
【7月更文挑战第60天】在移动开发领域,一个流畅且响应迅速的应用程序是用户留存的关键。针对Android平台,开发者面临的挑战包括多样化的设备兼容性和性能优化。本文将深入探讨如何通过改进布局设计、内存管理和多线程处理来构建高效的Android应用。我们将剖析布局优化的细节,并讨论最新的Android性能提升策略,以帮助开发者创建更快速、更流畅的用户体验。
43 10
|
10天前
|
Android开发
Android经典实战之Textview文字设置不同颜色、下划线、加粗、超链接等效果
本文介绍了 `SpannableString` 在 Android 开发中的强大功能,包括如何在单个字符串中应用多种样式,如颜色、字体大小、风格等,并提供了详细代码示例,展示如何设置文本颜色、添加点击事件等,助你实现丰富文本效果。
49 3
|
16天前
|
编解码 Android开发
【Android Studio】使用UI工具绘制,ConstraintLayout 限制性布局,快速上手
本文介绍了Android Studio中使用ConstraintLayout布局的方法,通过创建布局文件、设置控件约束等步骤,快速上手UI设计,并提供了一个TV Launcher界面布局的绘制示例。
30 1
|
13天前
|
图形学 iOS开发 Android开发
从Unity开发到移动平台制胜攻略:全面解析iOS与Android应用发布流程,助你轻松掌握跨平台发布技巧,打造爆款手游不是梦——性能优化、广告集成与内购设置全包含
【8月更文挑战第31天】本书详细介绍了如何在Unity中设置项目以适应移动设备,涵盖性能优化、集成广告及内购功能等关键步骤。通过具体示例和代码片段,指导读者完成iOS和Android应用的打包与发布,确保应用顺利上线并获得成功。无论是性能调整还是平台特定的操作,本书均提供了全面的解决方案。
66 0
|
24天前
|
开发工具 Android开发
Android项目架构设计问题之外部客户方便地设置回调如何解决
Android项目架构设计问题之外部客户方便地设置回调如何解决
16 0
|
4月前
|
存储 传感器 Android开发
构建高效Android应用:从优化布局到提升性能
【5月更文挑战第13天】 在竞争激烈的移动应用市场中,一个高效的Android应用不仅需要具备直观的用户界面和丰富的功能,还要确保流畅的性能和快速的响应时间。本文将深入探讨如何通过优化布局设计、减少资源消耗以及利用系统提供的API来提升Android应用的性能。我们将分析布局优化的策略,讨论内存使用的常见陷阱,并介绍异步处理和电池寿命的考量。这些技术的综合运用将帮助开发者构建出既美观又高效的Android应用。
|
4月前
|
缓存 监控 Android开发
构建高效Android应用:从优化布局到提升性能
【5月更文挑战第28天】 随着移动设备的普及,用户对Android应用的性能和响应速度有着越来越高的期待。本文旨在探讨一系列实用的技术和策略,帮助开发者在设计阶段就将性能考量纳入其中,以实现流畅和高效的用户体验。我们将深入分析布局优化、内存管理和多线程处理等关键领域,并提出具体的解决方案和最佳实践,以便开发过程中能够有效地避免常见的性能瓶颈。
|
4月前
|
缓存 编解码 移动开发
构建高效Android应用:从优化布局到提升性能
【5月更文挑战第20天】 在移动开发领域,一个流畅且响应迅速的应用是用户留存的关键。本文将深入探讨如何针对安卓平台优化应用性能,涵盖从布局优化、内存管理到多线程处理等多个方面。我们将通过实例和最佳实践指导开发者避免常见的性能陷阱,并利用现代安卓工具和技巧提高应用的整体效率。
|
XML 缓存 Java
Android 启动优化(六)- 深入理解布局优化
Android 启动优化(六)- 深入理解布局优化