Adapter(8)用BaseAdapter与listview返回不同样式的item示例
不同的项目布局(item layout)
我们举一个稍微复杂的listview例子,在list中加入一些分隔线
重写adapter时你需要做这些:
- 重(@Override)写 getViewTypeCount() – 返回你有多少个不同的布局
- 重写 getItemViewType(int) – 由position返回view type id
- 根据view item的类型,在getView中创建正确的convertView
效果如下:

以下是代码:
1.MultipleItemsListFrgmt.java 主fragment
1 public class MultipleItemsListFrgmt extends Fragment { 2 private ListView listView; 3 private MultipleItemCustomAdapter adapter; 4 private ArrayList<Object> mData = new ArrayList<Object>(); 5 6 void init() { 7 adapter = new MultipleItemCustomAdapter(getActivity()); 8 MultipleItem1 m1; 9 MultipleItem2 m2; 10 for (int i = 0; i < 50; i++) { 11 if (i != 0 && i % 5 == 0) { // add item2 12 m2 = new MultipleItem2(); 13 m2.text_value = "item2["+i + "]:"; 14 m2.seekbar_value = i; 15 mData.add(m2); 16 } else { // add item1 17 m1 = new MultipleItem1(); 18 m1.icon_resid = R.drawable.ic_child2; 19 m1.content_txt = "item1:[" + i + "]"; 20 mData.add(m1); 21 } 22 } 23 adapter.mData = mData; 24 listView.setAdapter(adapter); 25 } 26 27 @Override 28 public View onCreateView(LayoutInflater inflater, ViewGroup container, 29 Bundle savedInstanceState) { 30 View v = inflater.inflate(R.layout.frgmt_multiple_item_list, container, 31 false); 32 listView = (ListView) v.findViewById(R.id.vid_list_multiple_item); 33 init(); 34 return v; 35 } 36 }
2.主fragment的布局文件
1 <?xml version="1.0" encoding="utf-8"?> 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 android:layout_width="match_parent" 4 android:layout_height="match_parent" 5 android:orientation="vertical" > 6 7 <ListView 8 android:id="@+id/vid_list_multiple_item" 9 android:layout_width="match_parent" 10 android:layout_height="match_parent" > 11 12 </ListView> 13 14 </LinearLayout>
3.MultipleItemCustomAdapter.java 相应的adapter
1 public class MultipleItemCustomAdapter extends BaseAdapter { 2 3 private static final int TYPE_ITEM_1 = 0; 4 private static final int TYPE_ITEM_2 = 1; 5 private static final int TYPE_MAX_COUNT = TYPE_ITEM_2 + 1; 6 private LayoutInflater mInflater; 7 private Context context; 8 9 public ArrayList<Object> mData ; 10 11 public MultipleItemCustomAdapter(Context context) { 12 mInflater = LayoutInflater.from(context); 13 this.context = context; 14 } 15 16 @Override 17 public int getItemViewType(int position) { 18 return position != 0 && position % 5 == 0 ? TYPE_ITEM_2 : TYPE_ITEM_1; 19 } 20 21 @Override 22 public int getViewTypeCount() { 23 return TYPE_MAX_COUNT; 24 } 25 26 @Override 27 public int getCount() { 28 return mData.size(); 29 } 30 31 @Override 32 public Object getItem(int position) { 33 return mData.get(position); 34 } 35 36 @Override 37 public long getItemId(int position) { 38 return position; 39 } 40 41 @Override 42 public View getView(int position, View convertView, ViewGroup parent) { 43 int type = getItemViewType(position); 44 switch (type) { 45 case TYPE_ITEM_1: 46 return getItem1View(position, convertView, parent); 47 case TYPE_ITEM_2: 48 return getItem2View(position, convertView, parent); 49 default: 50 return null; 51 } 52 } 53 54 public View getItem1View(int position, View convertView, ViewGroup parent) { 55 if (convertView == null) { 56 convertView = mInflater.inflate(R.layout.multiple_item1, null); 57 } 58 ImageView iv = (ImageView) convertView 59 .findViewById(R.id.multiple_item1_icon); 60 TextView tv = (TextView) convertView 61 .findViewById(R.id.multiple_item1_content); 62 ToggleButton tb = (ToggleButton) convertView 63 .findViewById(R.id.tog_refresh); 64 Switch swi = (Switch) convertView.findViewById(R.id.swi_refresh); 65 66 final int pos = position; 67 tb.setOnClickListener(new View.OnClickListener() { 68 @Override 69 public void onClick(View v) { 70 Toast.makeText(context, "ToggleButton " + pos, 71 Toast.LENGTH_SHORT).show(); 72 } 73 }); 74 swi.setOnClickListener(new View.OnClickListener() { 75 76 @Override 77 public void onClick(View v) { 78 Toast.makeText(context, "Switch " + pos, Toast.LENGTH_SHORT) 79 .show(); 80 } 81 }); 82 MultipleItem1 m1 = (MultipleItem1)mData.get(position); 83 tv.setText(m1.content_txt); 84 return convertView; 85 } 86 87 public View getItem2View(int position, View convertView, ViewGroup parent) { 88 if (convertView == null) { 89 convertView = mInflater.inflate(R.layout.multiple_item2, null); 90 } 91 SeekBar sb = (SeekBar) convertView 92 .findViewById(R.id.vid_sb_multiple_item2); 93 final TextView tv = (TextView) convertView 94 .findViewById(R.id.vid_tv_txt_multiple_tiem2); 95 final MultipleItem2 m2 = (MultipleItem2) mData.get(position); 96 97 tv.setText(m2.text_value + m2.seekbar_value); 98 sb.setProgress(m2.seekbar_value); 99 sb.setOnSeekBarChangeListener(new OnSeekBarChangeListener() { 100 @Override 101 public void onStopTrackingTouch(SeekBar seekBar) { 102 } 103 @Override 104 public void onStartTrackingTouch(SeekBar seekBar) { 105 } 106 @Override 107 public void onProgressChanged(SeekBar seekBar, int progress, 108 boolean fromUser) { 109 if (fromUser) { 110 m2.seekbar_value = progress; 111 tv.setText(m2.text_value + m2.seekbar_value); 112 } 113 } 114 }); 115 return convertView; 116 } 117 118 }
这个getView方法写的不对,性能有问题,这样每次都要findViewById,正确写法应该使用ViewHolder和tag,见:
http://www.cnblogs.com/sjjg/articles/5446654.html
4.第一种item的布局与数据类型
布局文件 multiple_item1.xml
1 <?xml version="1.0" encoding="utf-8"?> 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 android:layout_width="match_parent" 4 android:layout_height="wrap_content" 5 android:gravity="center_vertical" 6 android:orientation="horizontal" > 7 8 <ImageView 9 android:id="@+id/multiple_item1_icon" 10 android:layout_width="wrap_content" 11 android:layout_height="wrap_content" 12 android:src="@drawable/ic_child2" /> 13 14 <TextView 15 android:id="@+id/multiple_item1_content" 16 android:layout_width="wrap_content" 17 android:layout_height="wrap_content" 18 android:text="item1" /> 19 20 <ToggleButton 21 android:id="@+id/tog_refresh" 22 android:layout_width="wrap_content" 23 android:layout_height="wrap_content" 24 android:text="ToggleButton" /> 25 26 27 <Switch 28 android:id="@+id/swi_refresh" 29 android:layout_width="wrap_content" 30 android:layout_height="wrap_content" /> 31 32 33 </LinearLayout>
item1对应的数据类型 MultipleItem1.java
public class MultipleItem1 extends Object{ public int icon_resid; public String content_txt; public boolean toggle_value; public boolean switch_value; }
5.第二种item对应的布局文件与数据类型
布局文件:multiple_item2.xml
1 <?xml version="1.0" encoding="utf-8"?> 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 android:layout_width="match_parent" 4 android:layout_height="wrap_content" 5 android:background="@drawable/popmenu_frame" 6 android:gravity="center_vertical|center_horizontal" 7 android:orientation="horizontal" > 8 9 <TextView 10 android:id="@+id/vid_tv_txt_multiple_tiem2" 11 android:layout_width="wrap_content" 12 android:layout_height="wrap_content" 13 android:text="item 2" /> 14 15 <SeekBar 16 android:id="@+id/vid_sb_multiple_item2" 17 android:layout_width="match_parent" 18 android:layout_height="wrap_content" 19 android:layout_weight="1" 20 android:max="100" 21 android:progress="100" /> 22 23 </LinearLayout>
数据类型:MultipleItem2.java
1 public class MultipleItem2 extends Object implements Comparable{ 2 public String text_value; 3 public int seekbar_value; 4 @Override 5 public int compareTo(Object another) { 6 MultipleItem2 an2 = (MultipleItem2)another; 7 return this.text_value.compareTo(an2.text_value); 8 } 9 }

浙公网安备 33010602011771号