ListView的优化技巧

在实际的应用开发时,往往有很多地方需要使用listview,当然我们得了解它的一些技巧。

1.ListView的优化技巧

主要使用ViewHolder来提高效率,利用它的视图缓存机制,避免每次在调用方getView()方法时通过findViewById()实例化控件。使用时,只需在自定义的adapter中定义内部类ViewHolder,将ListView的item中的控件作为其成员变量。

如下getView()方法:

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
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder = null;
// 判断是否缓存
if (convertView == null) {
holder = new ViewHolder();
// 通过LayoutInflater实例化布局
convertView = mInflater.inflate(R.layout.notify_item, null);
holder.img = (ImageView) convertView.findViewById(R.id.imageView);
holder.title = (TextView) convertView.findViewById(R.id.textView);
convertView.setTag(holder);
} else {
// 通过tag找到缓存的布局
holder = (ViewHolder) convertView.getTag();
}
// 设置布局中控件要显示的视图
holder.img.setBackgroundResource(R.drawable.ic_launcher);
holder.title.setText(mData.get(position));
return convertView;
}
//定义内部类
public final class ViewHolder {
public ImageView img;
public TextView title;
}

2.ListView的常用属性

设置分割线

1
android:divider="@null"

隐藏滚动条

1
android:scrollbars="none"

设置要显示在第N项

1
2
3
4
5
6
//瞬间完成
listView.setSelection(N);
//平滑完成
listView.smoothScrollBy(distance,duration);
listView.smoothScrollByOffset(offset);
listView.smoothScrollToPosition(n);

动态修改

1
2
//改变llist后调用
mAdapter.notifyDataSetChanged();

3.动态改变ListView的布局

如:实现聊天界面,加载连个布局的。
主要是比普通的adapter多实现getItemViewType()和getViewType()两个方法,然后再getView()中作出相应的处理。
如下部分主要代码:

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
//返回第position个item是何种类型
@Override
public int getItemViewType(int position) {
ChatItemListViewBean bean = mData.get(position);
return bean.getType();
}
//返回不同布局的总数
@Override
public int getViewTypeCount() {
return 2;
}</span>
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if (convertView == null) {
//判断布局类型
if (getItemViewType(position) == 0) {
holder = new ViewHolder();
convertView = mInflater.inflate(
R.layout.chat_item_itemin, null);
holder.icon = (ImageView) convertView.findViewById(
R.id.icon_in);
holder.text = (TextView) convertView.findViewById(
R.id.text_in);
} else {
holder = new ViewHolder();
convertView = mInflater.inflate(
R.layout.chat_item_itemout, null);
holder.icon = (ImageView) convertView.findViewById(
R.id.icon_out);
holder.text = (TextView) convertView.findViewById(
R.id.text_out);
}
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
holder.icon.setImageBitmap(mData.get(position).getIcon());
holder.text.setText(mData.get(position).getText());
return convertView;
}

此外,ListView还能设置滑动监听,有OnTouchListener和OnScrollListener监听事件。

当前网速较慢或者你使用的浏览器不支持博客特定功能,请尝试刷新或换用Chrome、Firefox等现代浏览器