Adapter(8)用BaseAdapter与listview返回不同样式的item示例

不同的项目布局(item layout)

我们举一个稍微复杂的listview例子,在list中加入一些分隔线

重写adapter时你需要做这些:

  1. 重(@Override)写 getViewTypeCount() – 返回你有多少个不同的布局
  2. 重写 getItemViewType(int) – 由position返回view type id
  3. 根据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 }

 

posted @ 2015-05-26 11:22  f9q  阅读(295)  评论(0)    收藏  举报