1.使用场景
在重写ListView的BaseAdapter时,我们常常在getView()方法中复用convertView,以提高性能。convertView在Item为单一的同种类型布局时,能够回收并重用,但是多个Item布局类型不同时,convertView的回收和重用会出现问题。比如有些行为纯文本,有些行则是图文混排,这里纯文本行为一类布局,图文混排的行为第二类布局。单一类型的ListView很简单,下面着重介绍一下ListView包含多种类型视图布局的情形。
2.ListView包含不同Item的布局
我们需要做这些工作:
1)重写 getViewTypeCount() – 该方法返回多少个不同的布局
2)重写 getItemViewType(int) – 根据position返回相应的Item
3)根据view item的类型,在getView中创建正确的convertView
3.案例
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
|
import
java.util.ArrayList; import
android.app.Activity; import
android.content.Context; import
android.os.Bundle; import
android.util.Log; import
android.view.LayoutInflater; import
android.view.View; import
android.view.ViewGroup; import
android.widget.BaseAdapter; import
android.widget.CheckBox; import
android.widget.ImageView; import
android.widget.LinearLayout; import
android.widget.ListView; import
android.widget.TextView; public
class listViewTest extends Activity { /**
Called when the activity is first created. */ ListView
listView; MyAdapter
listAdapter; ArrayList<String>
listString; @Override
public
void onCreate(Bundle savedInstanceState) { super .onCreate(savedInstanceState);
setContentView(R.layout.main);
listView
= (ListView) this .findViewById(R.id.listview);
listString
= new
ArrayList<String>(); for (int
i = 0 ; i < 100 ; i++) {
listString.add(Integer.toString(i));
}
listAdapter
= new
MyAdapter( this );
listView.setAdapter(listAdapter);
}
class
MyAdapter extends BaseAdapter{ Context
mContext; LinearLayout
linearLayout = null ;
LayoutInflater
inflater; TextView
tex; final
int VIEW_TYPE = 3; final
int TYPE_1 = 0; final
int TYPE_2 = 1; final
int TYPE_3 = 2; public
MyAdapter(Context context) { //
TODO Auto-generated constructor stub mContext
= context; inflater
= LayoutInflater.from(mContext); }
@Override
public
int getCount() { //
TODO Auto-generated method stub return
listString.size(); }
//每个convert
view都会调用此方法,获得当前所需要的view样式 @Override
public
int getItemViewType(int position) { //
TODO Auto-generated method stub int
p = position%6; if (p
== 0) return
TYPE_1; else
if (p
< 3) return
TYPE_2; else
if (p
< 6) return
TYPE_3; else return
TYPE_1; }
@Override
public
int getViewTypeCount() { //
TODO Auto-generated method stub return
3; }
@Override
public
Object getItem(int arg0) { //
TODO Auto-generated method stub return
listString.get(arg0); }
@Override
public
long getItemId(int position) { //
TODO Auto-generated method stub return
position; }
@Override
public
View getView(int position, View convertView, ViewGroup parent) { //
TODO Auto-generated method stub viewHolder1
holder1 = null ;
viewHolder2
holder2 = null ;
viewHolder3
holder3 = null ;
int
type = getItemViewType(position); //无convertView,需要new出各个控件
if (convertView
== null )
{
Log.e( "convertView
= " ,
"
NULL" );
//按当前所需的样式,确定new的布局
switch (type)
{
case
TYPE_1: convertView
= inflater.inflate(R.layout.listitem1, parent, false );
holder1
= new
viewHolder1(); holder1.textView
= (TextView)convertView.findViewById(R.id.textview1); holder1.checkBox
= (CheckBox)convertView.findViewById(R.id.checkbox); Log.e( "convertView
= " ,
"NULL
TYPE_1" );
convertView.setTag(holder1);
break ;
case
TYPE_2: convertView
= inflater.inflate(R.layout.listitem2, parent, false );
holder2
= new
viewHolder2(); holder2.textView
= (TextView)convertView.findViewById(R.id.textview2); Log.e( "convertView
= " ,
"NULL
TYPE_2" );
convertView.setTag(holder2);
break ;
case
TYPE_3: convertView
= inflater.inflate(R.layout.listitem3, parent, false );
holder3
= new
viewHolder3(); holder3.textView
= (TextView)convertView.findViewById(R.id.textview3); holder3.imageView
= (ImageView)convertView.findViewById(R.id.imageview); Log.e( "convertView
= " ,
"NULL
TYPE_3" );
convertView.setTag(holder3);
break ;
}
} else {
//有convertView,按样式,取得不用的布局
switch (type)
{
case
TYPE_1: holder1
= (viewHolder1) convertView.getTag(); Log.e( "convertView
!!!!!!= " ,
"NULL
TYPE_1" );
break ;
case
TYPE_2: holder2
= (viewHolder2) convertView.getTag(); Log.e( "convertView
!!!!!!= " ,
"NULL
TYPE_2" );
break ;
case
TYPE_3: holder3
= (viewHolder3) convertView.getTag(); Log.e( "convertView
!!!!!!= " ,
"NULL
TYPE_3" );
break ;
}
}
//设置资源
switch (type)
{
case
TYPE_1: holder1.textView.setText(Integer.toString(position));
holder1.checkBox.setChecked( true );
break ;
case
TYPE_2: holder2.textView.setText(Integer.toString(position));
break ;
case
TYPE_3: holder3.textView.setText(Integer.toString(position));
holder3.imageView.setBackgroundResource(R.drawable.icon);
break ;
}
return
convertView; }
}
//各个布局的控件资源
class
viewHolder1{ CheckBox
checkBox; TextView
textView; }
class
viewHolder2{ TextView
textView; }
class
viewHolder3{ ImageView
imageView; TextView
textView; }
} |