《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> items = null;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);ListView listView = this.getListView();BaseAdapter adapter = new MyBaseAdapter();items = new ArrayList>();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 group_map = new HashMap();group_map.put(TYPE, GROUP);group_map.put(DATA, groups[i]);items.add(group_map);for (int j = 0; j < 5; j++) {HashMap data_map = new HashMap();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);}@Overridepublic int getCount() {return items.size();}@Overridepublic Object getItem(int position) {HashMap map = items.get(position);return map.get(DATA);}// 返回的id可以自己定制。@Overridepublic long getItemId(int position) {return position;}@Overridepublic 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()的返回值。@Overridepublic int getItemViewType(int position) {HashMap 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.@Overridepublic int getViewTypeCount() {return VIEW_TYPE_COUNT;}}}


更多相关文章

  1. Android(安卓)适配器Adapter的学习
  2. android 字符串数组资源
  3. android Application学习之二
  4. Android(安卓)ListView Adapter的getItemViewType和getViewTypeC
  5. android 基本概念和一些术语
  6. ProgressBar的简单使用
  7. android数据库编程----SqLiteOpenHelper的使用
  8. Android(安卓)保存和恢复activity的状态数据
  9. mybatisplus的坑 insert标签insert into select无参数问题的解决

随机推荐

  1. 远程调试 Android 设备使用入门
  2. Android ConstraintLayout 约束布局详解
  3. Android(安卓)触摸事件大全
  4. Android 存储路径浅析
  5. Android模擬器adb命令介紹
  6. Android带多选功能的PhotoPicker
  7. 解决Android SDK Manager下载问题和andro
  8. android 电池(二):android关机充电流程、充
  9. [九鼎RK3399Pro] Android(安卓)8.1默认自
  10. android单位转换(TypedValue)