原地址:http://blog.csdn.net/zhangphil/article/details/46984367


《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。。。作为数据分组,然后每个字母下有五个数据。


如图:


全部代码:

[java]  view plain  copy
  1. package zhangphil.listview;  
  2.   
  3. import java.util.ArrayList;  
  4. import java.util.HashMap;  
  5.   
  6. import android.app.ListActivity;  
  7. import android.content.Context;  
  8. import android.graphics.Color;  
  9. import android.os.Bundle;  
  10. import android.view.LayoutInflater;  
  11. import android.view.View;  
  12. import android.view.ViewGroup;  
  13. import android.widget.BaseAdapter;  
  14. import android.widget.ListView;  
  15. import android.widget.TextView;  
  16.   
  17. public class MainActivity extends ListActivity {  
  18.   
  19.     // item view的类型总数。  
  20.     private final int VIEW_TYPE_COUNT = 2;  
  21.   
  22.     private final String DATA = "data";  
  23.     private final String TYPE = "type";  
  24.   
  25.     private final int GROUP = -2;  
  26.     private final int ITEM = -3;  
  27.   
  28.     private ArrayList> items = null;  
  29.   
  30.     @Override  
  31.     protected void onCreate(Bundle savedInstanceState) {  
  32.         super.onCreate(savedInstanceState);  
  33.   
  34.         ListView listView = this.getListView();  
  35.   
  36.         BaseAdapter adapter = new MyBaseAdapter();  
  37.   
  38.         items = new ArrayList>();  
  39.   
  40.         listView.setAdapter(adapter);  
  41.   
  42.         // 假设我们演示以A,B,C,,,这样的字符串作为分组的标签。  
  43.         // 每一组装载5个子数据。  
  44.         String[] groups = { "A""B""C""D""E""F" };  
  45.         int count = 0;  
  46.         for (int i = 0; i < groups.length; i++) {  
  47.             HashMap group_map = new HashMap();  
  48.             group_map.put(TYPE, GROUP);  
  49.             group_map.put(DATA, groups[i]);  
  50.             items.add(group_map);  
  51.   
  52.             for (int j = 0; j < 5; j++) {  
  53.                 HashMap data_map = new HashMap();  
  54.                 data_map.put(TYPE, ITEM);  
  55.                 data_map.put(DATA, "数据:" + (count++));  
  56.                 items.add(data_map);  
  57.             }  
  58.         }  
  59.     }  
  60.   
  61.     private class MyBaseAdapter extends BaseAdapter {  
  62.   
  63.         private LayoutInflater inflater = null;  
  64.   
  65.         public MyBaseAdapter() {  
  66.             inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);  
  67.         }  
  68.   
  69.         @Override  
  70.         public int getCount() {  
  71.             return items.size();  
  72.         }  
  73.   
  74.         @Override  
  75.         public Object getItem(int position) {  
  76.             HashMap map = items.get(position);  
  77.             return map.get(DATA);  
  78.         }  
  79.   
  80.         // 返回的id可以自己定制。  
  81.         @Override  
  82.         public long getItemId(int position) {  
  83.             return position;  
  84.         }  
  85.   
  86.         @Override  
  87.         public View getView(int position, View convertView, ViewGroup parent) {  
  88.               
  89.             int type = getItemViewType(position);  
  90.               
  91.             // 根据不同的view type加载不同的布局文件。  
  92.             switch (type) {  
  93.             case GROUP:  
  94.                 convertView = inflater.inflate(  
  95.                         android.R.layout.simple_list_item_2, null);  
  96.                 TextView tv1 = (TextView) convertView  
  97.                         .findViewById(android.R.id.text1);  
  98.                 tv1.setText("分组");  
  99.                 tv1.setBackgroundColor(Color.RED);  
  100.                 TextView tv2 = (TextView) convertView  
  101.                         .findViewById(android.R.id.text2);  
  102.                 tv2.setText(getItem(position) + "");  
  103.                 tv2.setBackgroundColor(Color.GRAY);  
  104.                 break;  
  105.             case ITEM:  
  106.                 convertView = inflater.inflate(  
  107.                         android.R.layout.simple_list_item_1, null);  
  108.                 TextView tv = (TextView) convertView  
  109.                         .findViewById(android.R.id.text1);  
  110.                 tv.setText(getItem(position) + "");  
  111.                 break;  
  112.             }  
  113.   
  114.             return convertView;  
  115.         }  
  116.   
  117.         // 解析view type。  
  118.         // view type值是我们事先埋入到items数据集中的字段值。  
  119.         // 注意!此处返回的值不要大于getViewTypeCount()的返回值。  
  120.         @Override  
  121.         public int getItemViewType(int position) {  
  122.             HashMap map = items.get(position);  
  123.             return (Integer) map.get(TYPE);  
  124.         }  
  125.   
  126.         // 在本例中共计有2个不同类型的view  
  127.         // android.R.layout.simple_list_item_1 和  
  128.         // android.R.layout.simple_list_item_1.  
  129.         @Override  
  130.         public int getViewTypeCount() {  
  131.             return VIEW_TYPE_COUNT;  
  132.         }  
  133.     }  
  134. }

更多相关文章

  1. android 解析json数据(一)
  2. TCPDUMP for Android(抓TCP数据包工具)
  3. Android跨进程通信之ContentProvider
  4. Android(安卓)Intent实现页面跳转
  5. android备份服务流程
  6. 14天学会安卓开发(第十天)Android网络与通讯
  7. Android之解析Json数据 .
  8. Android(安卓)Architecture Components 部分源码代码分析
  9. android中handler 轮询数据变化 使用WeakReference防止内存泄露

随机推荐

  1. android屏幕截图
  2. android scrollrefreshlist
  3. Android(安卓)Q 测试版
  4. 星星CheckBox按钮
  5. android TextSwitcher
  6. Android(安卓)Property System
  7. android sdk wenti
  8. SPEEX ON ANDROID
  9. Talking about Android(安卓)Process
  10. android 系统编译要求,官方资料