ListView使用技巧
在Android应用中,ListView作为列表展示的控件,是一个很常用的控件。在大量场合下,我们都会用到这个控件,整理一下常用的技巧。
1 . ListView常用技巧
使用ViewHolder模式提高效率
ViewHolder模式充分利用ListView的视图缓存机制,避免了每次调用getView()的时候都去通过findViewById()实例化控件。效率与不使用相比,效率提高50%以上。只需要在自定义Adapter中定义内部ViewHolder类,代码如下:
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder viewHolder = null;
//判断是否缓存
if(convertView == null){
convertView = inflater.inflate(R.layout.listitem, parent, false);
viewHolder = new ViewHolder();
viewHolder.tv = (TextView) convertView.findViewById(R.id.tv);
viewHolder.img = (ImageView) convertView.findViewById(R.id.img);
viewHolder.btn =(Button) convertView.findViewById(R.id.btn);
convertView.setTag(viewHolder);
}else{
//通过tag找到缓存的布局
viewHolder = (ViewHolder) convertView.getTag();
}
return convertView;
}
final class ViewHolder{
public TextView tv;
public ImageView img;
public Button btn;
}
- 设置分割线
xml中
//设置分割线透明,一般在item用view设置自己的分割线
android:divider="@null"
//代码中
listView.setDivider(Drawable);
- 设置ListView的item点击效果
//xml中设置item点击效果为透明
android:listSelector="@android:color/transparent"
//设置item的BackGround为自己想要的点击效果
- 设置ListView显示在第几项
//类似scrollTo瞬间移动完成
istView.setSelection(int );
//平滑移动
listView.smoothScrollByOffset(offset);
listView.smoothScrollBy(distance, duration);
listView.smoothScrollToPosition(position);
- 动态修改ListView
//当数据源改变时,只需要调用此方法即可改变ListView展示的内容
adapter.notifyDataSetChanged();
- 遍历ListView中的所有Item
for(int i=0;i<listView.getChildCount();i++){
View view = listView.getChildAt(i);
}
- 处理空ListView
<!-- ListView 空视图必须跟ListView放在一起 -->
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<ListView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:divider="@null"
android:listSelector="@android:color/transparent" />
<ImageView
android:id="@+id/empty"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:src="@drawable/ic_launcher" />
</FrameLayout>
<!-- 代码中设置,有数据时不会显示,没有时才显示 -->
listView.setEmptyView(View);
ListView滑动监听
(1) .OnTouchListener
通过坐标判断用户滑动的方向,并进行相应的逻辑处理。
listView.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
//触摸时逻辑
break;
case MotionEvent.ACTION_MOVE:
//移动时逻辑
break;
case MotionEvent.ACTION_UP:
//离开时逻辑
break;
}
return false;
}
});
(2) . OnScrollListener
既是对ListView滑动状态的监听,常用的方法代码如下:
listView.setOnScrollListener(new OnScrollListener() {
@Override
public void onScrollStateChanged(ZrcAbsListView view, int scrollState) {
switch(scrollState){
case SCROLL_STATE_IDLE:
//滑动停止时
break;
case SCROLL_STATE_TOUCH_SCROLL:
//正在滚动时
break;
case SCROLL_STATE_FLING:
//手指抛动,惯性滑动时
break;
}
}
/**
*
* int firstVisibleItem:当前能看见的第一个Item ID
* int visibleItemCount:当前能看见的item总数
* int totalItemCount:挣个istview的tem总数
*
* */
private int lastVisiableItem;
@Override
public void onScroll(ZrcAbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
//滚动时一直调用
if(firstVisibleItem+visibleItemCount==totalItemCount&&totalItemCount>0){
//滚动到最后一行
}
if(firstVisibleItem>lastVisiableItem){
//上滑
}else{
//下滑
}
lastVisiableItem = firstVisibleItem;
}
});
//获取可视区域内第一个item id
listView.getFirstVisiblePosition();
//获取可视区域内最后一个item id
listView.getLastVisiblePosition();