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



posted @ 2017-07-21 08:18  zsychanpin  阅读(332)  评论(0编辑  收藏  举报