之前在使用listview进行每次通知一来,根据判断是否有这个标志,就更新listview所绑定的数据源,通知更新priceAd.notifyDataSetChanged();,也用了网上的建议使用viewHolder进行listview的item复用机制,但还是会出现卡顿的现象,经过分析,原来是listview的item布局嵌套太多,导致刷新的时候,重绘过多,造成卡顿的现象,以下是另一片博客的分析贴出来,大家讨论感谢这位前辈:http://blog.csdn.net/knighttools/article/details/18259485:
复制代码
1
2
3
4
5
6
7
8
9
10解决与分析: 通过百度,View在Draw的时候分成两个阶段:measure和layout,在measure阶段时主要就是为了计算两个参数:height和width。而且要注意的是,这是个递归的过程,从顶向下,DecorView开始依次调用自己子元素的measure。计算完成这两个参数后就开始layout,最后再是draw的调用。 对于ListView,当然每一个Item都会被调用measure方法,而在这个过程中getView和getCount会被调用,而且看用户的需求,可能会有很多次调用。 而为什么会有很多组次调用呢? 问题就在于在layout中的决定ListView或者它的父元素的height和width属性的定义了。fill_parent会好一点,计算方法会比较简单,只要跟父元素的大小相似就行,但是即使是fill_parent,也不能给View当饭吃,还是要计算出来具体的dip,所以measure还是会被调用,只是可能比wrap_content的少一点。至于自适应的它会一直考量它的宽和高,根据内容(也就是它的子Item)计算宽高。可能这个measure过程会反复执行,如果父元素也是wrap_content,这个过程会更加漫长。 所以,解决方法就是尽量避免自适应,除非是万不得已,固定大小或者填充的效果会比较好一些。 于是我们把listview与他父控件的所有高度与宽度都设置为fill_parent,果然getview调用正常了,注意是所有的高度和宽度! 当发现初始化adapter的时候正常调用之后,我们再来尝试滑动listview,发现每出现一个item,当前视图显示的item又调用了一次getview,通过刚哥的这篇帖子,定位到问题在我的getview中使用了// notifyDataSetChanged(); 把这行去掉 listview 就已经宣告不再卡顿了! 附带刚哥的listview卡顿终极解决方案原帖:刚哥的Listview卡顿终极解决方案。
根据他的提示,我的确发现自己的item的布局,嵌套了很多层的linearLayout,把它们删掉,改成权重布局,先前的布局如下:
复制代码
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
186
187
188
189
190
191
192<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_margin="10dp" android:background="@color/background" android:orientation="vertical" > <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_margin="5dp" android:orientation="vertical" > <LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="horizontal" > <TextView android:id="@+id/price_quote_inst" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginRight="25dp" android:layout_weight="1" android:gravity="right" android:singleLine="true" android:text="WYB/TEST" android:textColor="@color/white" android:textSize="20dp" > </TextView> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignParentRight="true" android:layout_gravity="bottom|right" android:layout_weight="2" android:gravity="bottom|right" android:orientation="horizontal" > <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:singleLine="true" android:text="時間:" android:textColor="@color/white" android:textSize="16dp" > </TextView> <TextView android:id="@+id/price_quote_time" android:layout_width="wrap_content" android:layout_height="wrap_content" android:singleLine="true" android:text="14:34:47" android:textColor="@color/white" android:textSize="16dp" > </TextView> </LinearLayout> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="5dp" android:orientation="horizontal" > <LinearLayout android:id="@+id/sellMktt" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_weight="1" android:background="@drawable/pair_sell_select" android:orientation="vertical" > <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="2dp" android:gravity="center" android:text="@string/activity_price_pricewarning_add4modify_sellprice" android:textColor="@color/white" /> <TextView android:id="@+id/price_quote_sellprice" android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="center" android:text="0.7023" android:textSize="20dp" android:textStyle="bold" /> </LinearLayout> <TextView android:layout_width="2dp" android:layout_height="wrap_content" /> <LinearLayout android:id="@+id/buyMktt" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_weight="1" android:background="@drawable/ordertrade_pair_buy_select" android:orientation="vertical" > <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="2dp" android:gravity="center" android:text="@string/activity_price_pricewarning_add4modify_buyprice" android:textColor="@color/gray" /> <TextView android:id="@+id/price_quote_buyprice" android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="center" android:text="0.7023" android:textSize="20dp" android:textStyle="bold" /> </LinearLayout> </LinearLayout> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="3dp" android:orientation="horizontal" > <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginLeft="10dp" android:layout_weight="1" android:orientation="horizontal" > <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text=":" android:textColor="@color/white" android:textSize="14sp" /> <TextView android:id="@+id/price_quote_low" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="0.6844" android:textColor="@color/white" android:textSize="14sp" /> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_weight="1" android:orientation="horizontal" > <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text=":" android:textColor="@color/white" android:textSize="14sp" /> <TextView android:id="@+id/price_quote_updown" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="-1.91" android:textColor="@color/white" android:textSize="14sp" /> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_weight="1" android:orientation="horizontal" > <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_gravity="left" android:layout_weight="2" android:text=":" android:textColor="@color/white" android:textSize="14sp" /> <TextView android:id="@+id/price_quote_high" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_gravity="right" android:layout_weight="1" android:text="0.7130" android:textColor="@color/white" android:textSize="14sp" /> </LinearLayout> </LinearLayout> <View android:layout_width="match_parent" android:layout_height="1.2px" android:layout_marginLeft="14dp" android:layout_marginRight="14dp" android:layout_marginTop="5dp" android:background="@color/white" /> <TextView android:id="@+id/hidepricemenu" android:layout_width="match_parent" android:layout_height="30dp" android:visibility="gone" /> </LinearLayout>
将android:layout_width都改成fill_parent,并且将linearLayout都删除掉,改成权重布局,如下:
复制代码
重启手机app,发现界面一点都不会卡了,所以接受一个教训就是布局如果要刷新的话,建议还是不要嵌套太多层,毕竟重绘很耗时间。
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<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_margin="10dp" android:background="@color/background" android:orientation="vertical" > <LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_margin="5dp" android:orientation="vertical" > <LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="horizontal" > <TextView android:id="@+id/price_quote_inst" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginRight="25dp" android:layout_weight="1" android:gravity="right" android:singleLine="true" android:text="WYB/TEST" android:textColor="@color/white" android:textSize="20dp" > </TextView> <LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_alignParentRight="true" android:layout_gravity="bottom|right" android:layout_weight="2" android:gravity="bottom|right" android:orientation="horizontal" > <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:singleLine="true" android:text="時間:" android:textColor="@color/white" android:textSize="16dp" > </TextView> <TextView android:id="@+id/price_quote_time" android:layout_width="wrap_content" android:layout_height="wrap_content" android:singleLine="true" android:text="14:34:47" android:textColor="@color/white" android:textSize="16dp" > </TextView> </LinearLayout> </LinearLayout> <LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_marginTop="5dp" android:orientation="horizontal" > <LinearLayout android:id="@+id/sellMktt" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_weight="1" android:background="@drawable/pair_sell_select" android:orientation="vertical" > <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_marginTop="2dp" android:gravity="center" android:text="@string/activity_price_pricewarning_add4modify_sellprice" android:textColor="@color/white" /> <TextView android:id="@+id/price_quote_sellprice" android:layout_width="fill_parent" android:layout_height="match_parent" android:gravity="center" android:text="0.7023" android:textSize="20dp" android:textStyle="bold" /> </LinearLayout> <TextView android:layout_width="2dp" android:layout_height="wrap_content" /> <LinearLayout android:id="@+id/buyMktt" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_weight="1" android:background="@drawable/ordertrade_pair_buy_select" android:orientation="vertical" > <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_marginTop="2dp" android:gravity="center" android:text="@string/activity_price_pricewarning_add4modify_buyprice" android:textColor="@color/gray" /> <TextView android:id="@+id/price_quote_buyprice" android:layout_width="fill_parent" android:layout_height="match_parent" android:gravity="center" android:text="0.7023" android:textSize="20dp" android:textStyle="bold" /> </LinearLayout> </LinearLayout> </LinearLayout> <LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_marginTop="3dp" android:orientation="horizontal" > <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_weight="1" android:text=":" android:textColor="@color/white" android:textSize="14sp" /> <TextView android:id="@+id/price_quote_low" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_weight="1" android:text="0.6844" android:textColor="@color/white" android:textSize="14sp" /> <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_weight="1" android:text=":" android:textColor="@color/white" android:textSize="14sp" /> <TextView android:id="@+id/price_quote_updown" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_weight="1" android:text="-1.91" android:textColor="@color/white" android:textSize="14sp" /> <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_gravity="left" android:layout_weight="1" android:text=":" android:textColor="@color/white" android:textSize="14sp" /> <TextView android:id="@+id/price_quote_high" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_gravity="right" android:layout_weight="1" android:text="0.7130" android:textColor="@color/white" android:textSize="14sp" /> </LinearLayout> <View android:layout_width="fill_parent" android:layout_height="1.2px" android:layout_marginLeft="14dp" android:layout_marginRight="14dp" android:layout_marginTop="5dp" android:background="@color/white" /> <TextView android:id="@+id/hidepricemenu" android:layout_width="fill_parent" android:layout_height="30dp" android:visibility="gone" /> </LinearLayout>
最后
以上就是过时鸡翅最近收集整理的关于android listview 滑动卡顿问题解决的全部内容,更多相关android内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复