ListView作为最常用的显示效果之一,基本用法相信大家已经了解,
下面我们重新学习一下ListView的技巧:
1.1,使用ViewHolder模式提高效率
ViewHolder模式是提高ListView效率的一很重要的方法。ViewHolder模式充分利用了ListView的视图缓存机制,避免了每次在调用getView()的时候都去通过findViewById()实例化空间。据测试,使用ViewHolder将提高50%以上的效率。使用ViewHolder模式来优化ListView非常简单,只需要在自定义Adapter中定义一个内部类ViewHolder,并将布局中的控件作为成员变量,代码如下所示:
public View getView(int pos, View convertView, ViewGroup parent){
ViewHolder holder;
//判断是否缓存
if (convertView == null) {
//通过layoutInflater实例化布局
convertView = mInflater.inflate(R.layout.list_item, null);
holder.text = (TextView) convertView.findViewById( R.id.text));
holder.icon = (ImageView) convertView.findViewButId( R.id.icon));
convertView.setTag(holder);
}else {
//通过tag找到缓存的布局
holder = (ViewHolder) convertView.getTag();
}
holder.text.setText(DATA[pos]);
holder.icon.setImageBitmap((pos & 1) == 1 ? mIcon1 : mIcon2);
return convertView;
}
//创建一个内部类ViewHolder,final,static修饰词,然并卵。
class ViewHolder {
TextView text;
ImageView icon;
}
1.2,设置项目间分隔线
android:divider="@color/divider_color"
android:dividerHeight="1px"
把分割线设置成透明;
android:divider="@color/divider_color"
1.3,隐藏ListView的滚动条
android:scrollbars="none"
1.4,取消ListView的Item点击效果
当点击ListView中的一项是,系统默认会出现一个点击效果,在android5.X以上是一个波纹效果,而在Android5.X一下的版本则是一个改变背景颜色的效果,当可以通过修改listSelector属性来取消掉点击后的回馈效果,代码如下:
android:listSelector="#00000000"
1.5,设置ListView需要显示在第几项
listView.setSelection(N);
其中N就是需要显示的第N个Item。
当然,这个方法类似scrollTo,是瞬间完成的移动。除此之外,还可以使用如下代码来实现平滑移动。
mListView.smoothScrollBy(distance,duration);
mListView.smoothScrollByOffset(offset);
mListView.smoothScrollToPosition(index);
1.6,动态修改ListView
当然这里的mData必须和传进去的是同一个。
mData.add("new:);
mAdapter.notifyDataSetChanged();
1.7,遍历ListView中的所有Item
ListView作为一个ViewGroup,为我们提供了操纵子View的各种方法,最常用的就是通过getChildAt()来获取第i个子View,代码如下所示。
for(int i =0;i<mListView.getChildCount();i++){
View view = mListView.getChildAt(i);
}
1.8,处理空ListView
我们在使用ListView展示数据时,如何需要展示的数据集为空,那么ListView不会显示任何数据或提示,按照完善这一用户体验的需求,ListView提供了一个方法setEmptyView,当数据集为空时,就显示设置的这个界面。
<LinearLayout
android:id="@+id/LinearLayout1"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_below="@+id/layoutTitlebar">
<ListView
android:id="@+id/listViewFriends"
android:layout_height="match_parent"
android:layout_width="match_parent"
android:background="@color/friendBGColor"
android:cacheColorHint="#00000000">
</ListView>
<ImageView
android:id="@+id/empty_image"
android:text="@string/strNoRecordsFound"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:src="@drawable/empty"
android:gravity="center">
</ImageView>
</LinearLayout>
在代码中,我们通过以下方式给ListView设置空数据时要显示的布局,代码如下所示。
ListView listView = (ListView)findViewById(R.id.listview);
listView.setEmptyView(findViewById(R.id.empty_image));