Android ListView Adapter的getItemViewType和getViewTypeCount多种布局



《Android ListView Adapter的getItemViewType和getViewTypeCount多种布局》

在Android的ListView中,如果在一个ListView中要实现多种样式的ListView布局样式,则需要在ListView的适配器Adapter中用到:getItemViewType()和getViewTypeCount()。getViewTypeCount()告诉ListView需要加载多少种类型的Item View,getItemViewType()则告诉ListView在某一位置(position)的Item View样式是什么。

现给出一个示例加以,说明,本例简单的以字母A、B、C。。。作为数据分组,然后每个字母下有五个数据。

如图:

全部代码:

package zhangphil.listview;

import java.util.ArrayList;
import java.util.HashMap;

import android.app.ListActivity;
import android.content.Context;
import android.graphics.Color;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ListView;
import android.widget.TextView;

public class MainActivity extends ListActivity {

	// item view的类型总数。
	private final int VIEW_TYPE_COUNT = 2;

	private final String DATA = "data";
	private final String TYPE = "type";

	private final int GROUP = -2;
	private final int ITEM = -3;

	private ArrayList<HashMap<String, Object>> items = null;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);

		ListView listView = this.getListView();

		BaseAdapter adapter = new MyBaseAdapter();

		items = new ArrayList<HashMap<String, Object>>();

		listView.setAdapter(adapter);

		// 假设我们演示以A,B,C,,,这样的字符串作为分组的标签。
		// 每一组装载5个子数据。
		String[] groups = { "A", "B", "C", "D", "E", "F" };
		int count = 0;
		for (int i = 0; i < groups.length; i++) {
			HashMap<String, Object> group_map = new HashMap<String, Object>();
			group_map.put(TYPE, GROUP);
			group_map.put(DATA, groups[i]);
			items.add(group_map);

			for (int j = 0; j < 5; j++) {
				HashMap<String, Object> data_map = new HashMap<String, Object>();
				data_map.put(TYPE, ITEM);
				data_map.put(DATA, "数据:" + (count++));
				items.add(data_map);
			}
		}
	}

	private class MyBaseAdapter extends BaseAdapter {

		private LayoutInflater inflater = null;

		public MyBaseAdapter() {
			inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
		}

		@Override
		public int getCount() {
			return items.size();
		}

		@Override
		public Object getItem(int position) {
			HashMap<String, Object> map = items.get(position);
			return map.get(DATA);
		}

		// 返回的id可以自己定制。
		@Override
		public long getItemId(int position) {
			return position;
		}

		@Override
		public View getView(int position, View convertView, ViewGroup parent) {

			int type = getItemViewType(position);

			// 根据不同的view type加载不同的布局文件。
			switch (type) {
			case GROUP:
				convertView = inflater.inflate(
						android.R.layout.simple_list_item_2, null);
				TextView tv1 = (TextView) convertView
						.findViewById(android.R.id.text1);
				tv1.setText("分组");
				tv1.setBackgroundColor(Color.RED);
				TextView tv2 = (TextView) convertView
						.findViewById(android.R.id.text2);
				tv2.setText(getItem(position) + "");
				tv2.setBackgroundColor(Color.GRAY);
				break;
			case ITEM:
				convertView = inflater.inflate(
						android.R.layout.simple_list_item_1, null);
				TextView tv = (TextView) convertView
						.findViewById(android.R.id.text1);
				tv.setText(getItem(position) + "");
				break;
			}

			return convertView;
		}

		// 解析view type。
		// view type值是我们事先埋入到items数据集中的字段值。
		// 注意!此处返回的值不要大于getViewTypeCount()的返回值。
		@Override
		public int getItemViewType(int position) {
			HashMap<String, Object> map = items.get(position);
			return (Integer) map.get(TYPE);
		}

		// 在本例中共计有2个不同类型的view
		// android.R.layout.simple_list_item_1 和
		// android.R.layout.simple_list_item_1.
		@Override
		public int getViewTypeCount() {
			return VIEW_TYPE_COUNT;
		}
	}
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-08-11 07:42:04

Android ListView Adapter的getItemViewType和getViewTypeCount多种布局的相关文章

Android Listview &amp; Adapter

Listview主要有两个职责: 将数据填充到布局 处理用户的选择点击等操作 列表的显示需要三个元素: ListVeiw 用来展示列表的View 适配器(Adapter) 用来把数据映射到ListView上的中介 数据(data)    具体的将被映射的字符串,图片,或者基本组件 首先要了解什么是适配器: 适配器是一个连接数据和AdapterView(ListView就是一个典型的AdapterView)的桥梁,通过它能有效地实现数据与AdapterView的分离设置,使AdapterView与

android 实现listview的adapter多种布局方式

这两天在实现某模块的排行榜功能,看了UI给的效果图和切图,感觉有点郁闷,因为平时使用listview时,子项都是只有一种布局方式,而这次却有两种.于是专门研究了下,发现重写adapter的getItemViewType()和getViewTypeCount()方法就可以实现多种布局方式,把自己的实现贴出来共享下. 步骤: 1. 重写 getViewTypeCount() – 返回你有多少个不同的布局: 2. 重写 getItemViewType(int) – 由position返回view ty

Android之ListView的getItemViewType和getViewTypeCount

PS:感觉这两个方法其实还是很容易理解的,也算是给我其他两个朋友写的吧,帮他们搞清楚这两个方法的用法和概念.同时还有一些小细节问题需要注意. 学习内容: 1.getItemViewType和getViewTypeCount   getItemViewType和getViewTypeCount是ListView中实现复杂列表的两个相关的方法,普通的ListView中Item是相同的,那么我们只需要实现Adapter中四个抽象方法即可,但是如果页面中Item长得比较的复杂呢?比如说这个. 比如说这个

Android开发之ListView添加多种布局效果演示

在这个案例中展示的新闻列表,使用到ListView控件,然后在适配器中添加多种布局效果,这里通过重写BaseAdapter类中的 getViewType()和getItemViewType()来做判断,指定ListView列表中指定位置的item加载对应的布局,在 getView中返回对应的视图,之前由于不清楚getViewTypeCount()和getItemViewType()方法,使用得比较少,一直以 为需要添加多个适配器,现在看来当时的想法说明自己见识还不够,哈哈. 第一步:创建放置Li

Android应用之——利用getItemViewType为Listview的item设置不同的布局

一.概述 在项目的需求中,有一处需要显示一个交易记录的列表,这个列表很容易让人联想到用listview来实现,但是这个列表又有稍许不同的地方,那就是它里面的item并不是一样的布局,其中某些部分显示的是消费的记录,而有些地方显示的是充值的记录,也就对应了不同的item布局.而且,这两处地方都是从服务端获取数据的,这两个item的数据对应的类内容也各不相同,该怎么处理呢? 下面来一步步实现这个效果. 二.先看效果图 三.实现步骤 实现的原理就是listview的adapter中的一个关键的方法就是

Android ListView 多种布局--进阶二

Android ListView 多种布局–进阶一 中提及了这么一个需求,本博文就这个需求的实现做进一步探讨. 前面是单列,后面是双列的情况,使用ListView实现,一般的解决思路是处理getView和getCount方法,如下实现: 首先实现Adapter,处理getView和getCount方法 public class DoubleAdapter extends BaseAdapter implements OnClickListener{ private List<String> m

Android新闻类界面分享(多种布局的listview)

最近项目里需要一个新闻资讯的界面,就自己试着做了一下,还是非常简单的.实现是重写BaseAdapter,创建自己的adapter,以及popupwindow效果. 效果图: 下面是新闻主界面,所有的新闻条目都显示在这个页面中 Titlebar右边有一个按钮,可以选择具体门类的新闻. 点开某一条新闻直接根据url打开一个webview(这里我偷懒了,大家可以自己完善) adapter的编写 从上面效果图可以看到,一个listview中包含了3种不同的样式. 没有图片的新闻 有一张大图片的新闻 有一

Android开发笔记(12)——ListView &amp; Adapter

转载请注明:http://www.cnblogs.com/igoslly/p/6947225.html 下一章是关于ListFragment的内容,首先先介绍ListView的相关配置,理解ListFragment也相较容易. 在fznpcy专栏:http://blog.csdn.net/fznpcy/article/details/8658155/有较为详尽的讲解和范例. ListView & Adapter 一.Adapter Adapter是连接后端数据和前端显示的适配器接口,是数据和UI

Android 自定义Adapter 但listview 只显示第一条数据

楼主让这个问题郁闷了一晚上.....在logcat里明明显示adapter的getview方法里的list大于一条数据 ,但posotion却一直是0.....运行后也只显示list[0]里面的数据....最后的最后原来错误出在布局文件上 我以前的是这样的; <ScrollView android:layout_width="fill_parent" android:layout_height="wrap_content" > <!-- listv