Android ListView Adapter的getItemViewType和getViewTypeCount多种布局

来源:互联网 发布:琉璃神社备用域名 编辑:程序博客网 时间:2024/05/18 02:37

原地址: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<HashMap<String, Object>> 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<HashMap<String, Object>>();  
  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<String, Object> group_map = new HashMap<String, Object>();  
  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<String, Object> data_map = new HashMap<String, Object>();  
  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<String, Object> 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<String, Object> 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. }

0 0
原创粉丝点击