Adapter的getViewTypeCount和getItemViewType及-ListView/GridView

desaco發表於2016-05-19
Adapter的getViewTypeCount和getItemViewType

不同的專案佈局(item layout)

我們再舉一個稍微複雜的例子,在上例的list中加入一些分隔線

你需要做這些:

  1. 重(@Override)寫 getViewTypeCount() – 返回你有多少個不同的佈局
  2. 重寫 getItemViewType(int) – 由position返回view type id
  3. 根據view item的型別,在getView中建立正確的convertView

以下是程式碼:

[java] view plain copy
  1. public class MultipleItemsList extends ListActivity {  
  2.    
  3.     private MyCustomAdapter mAdapter;  
  4.    
  5.     @Override  
  6.     public void onCreate(Bundle savedInstanceState) {  
  7.         super.onCreate(savedInstanceState);  
  8.         mAdapter = new MyCustomAdapter();  
  9.         for (int i = 1; i < 50; i++) {  
  10.             mAdapter.addItem("item " + i);  
  11.             if (i % 4 == 0) {  
  12.                 mAdapter.addSeparatorItem("separator " + i);  
  13.             }  
  14.         }  
  15.         setListAdapter(mAdapter);  
  16.     }  
  17.    
  18.     private class MyCustomAdapter extends BaseAdapter {  
  19.    
  20.         private static final int TYPE_ITEM = 0;  
  21.         private static final int TYPE_SEPARATOR = 1;  
  22.         private static final int TYPE_MAX_COUNT = TYPE_SEPARATOR + 1;  
  23.    
  24.         private ArrayList mData = new ArrayList();  
  25.         private LayoutInflater mInflater;  
  26.    
  27.         private TreeSet mSeparatorsSet = new TreeSet();  
  28.    
  29.         public MyCustomAdapter() {  
  30.             mInflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);  
  31.         }  
  32.    
  33.         public void addItem(final String item) {  
  34.             mData.add(item);  
  35.             notifyDataSetChanged();  
  36.         }  
  37.    
  38.         public void addSeparatorItem(final String item) {  
  39.             mData.add(item);  
  40.             // save separator position  
  41.             mSeparatorsSet.add(mData.size() - 1);  
  42.             notifyDataSetChanged();  
  43.         }  
  44.    
  45.         @Override  
  46.         public int getItemViewType(int position) {  
  47.             return mSeparatorsSet.contains(position) ? TYPE_SEPARATOR : TYPE_ITEM;  
  48.         }  
  49.    
  50.         @Override  
  51.         public int getViewTypeCount() {  
  52.             return TYPE_MAX_COUNT;  
  53.         }  
  54.    
  55.         @Override  
  56.         public int getCount() {  
  57.             return mData.size();  
  58.         }  
  59.    
  60.         @Override  
  61.         public String getItem(int position) {  
  62.             return mData.get(position);  
  63.         }  
  64.    
  65.         @Override  
  66.         public long getItemId(int position) {  
  67.             return position;  
  68.         }  
  69.    
  70.         @Override  
  71.         public View getView(int position, View convertView, ViewGroup parent) {  
  72.             ViewHolder holder = null;  
  73.             int type = getItemViewType(position);  
  74.             System.out.println("getView " + position + " " + convertView + " type = " + type);  
  75.             if (convertView == null) {  
  76.                 holder = new ViewHolder();  
  77.                 switch (type) {  
  78.                     case TYPE_ITEM:  
  79.                         convertView = mInflater.inflate(R.layout.item1, null);  
  80.                         holder.textView = (TextView)convertView.findViewById(R.id.text);  
  81.                         break;  
  82.                     case TYPE_SEPARATOR:  
  83.                         convertView = mInflater.inflate(R.layout.item2, null);  
  84.                         holder.textView = (TextView)convertView.findViewById(R.id.textSeparator);  
  85.                         break;  
  86.                 }  
  87.                 convertView.setTag(holder);  
  88.             } else {  
  89.                 holder = (ViewHolder)convertView.getTag();  
  90.             }  
  91.             holder.textView.setText(mData.get(position));  
  92.             return convertView;  
  93.         }  
  94.    
  95.     }  
  96.    
  97.     public static class ViewHolder {  
  98.         public TextView textView;  
  99.     }  
  100. }  

執行程式,你會看到每4個item一個分割線:

引用:ListView:  http://blog.csdn.net/jdsjlzx/article/details/8273661

GridView:  http://blog.csdn.net/alovebtoc/article/details/14058015

相關文章