1、ListView的常用优化技巧
1)使用ViewHolder模式提高效率
@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;
}
//ViewHolder类
static class ViewHolder {
public ImageView icon;
public TextView text;
}
2)ListView的一些常用属性
设置项目分割线
android:divider=”@android:color/holo_green_light”
android:dividerHeight=”2dp”
透明
android:divider=”@null”隐藏滚动条
android:scrollbars=”none”
取消ListView的Item点击效果(设置为透明)
android:listSelector=”@android:color/transparent”
android:listSelector=”#00000000”设置ListView显示在第几项(瞬间完成)
listView.setSelection(N)
或
listview.smoothScrollBy(distance, duration);
listview.smoothScrollByOffset(offset);
listview.smoothScrollToPosition(index);动态修改ListView
mAdapter.notifyDataSetChanged()
遍历ListView中的所有Item
for(int i = 0;i < mListView.getChildCount();i++){ View view = mListView.getChildAt(i); }
处理空ListView
listView.setEmptyView()
3)ListView滑动监听
许多重写的ListView都是在滑动事件上下功夫。监听辅助类有,GestureDetecor手势识别,VelocityTracker滑动速度检测等。
下面介绍OnTouchListener与OnScrollListener
OnTouchListener
View中的监听事件,通过监听ACTION_DOWN,ACTION_MOVE,ACTION_UP这三个事件发生时的坐标,来判断滑动方向
OnScrollListener
public interface OnScrollListener {
//有三种状态
//滚动停止时
public static int SCROLL_STATE_IDLE = 0;
//正在滚动时
public static int SCROLL_STATE_TOUCH_SCROLL = 1;
//手指抛动时,手指用力滑动,在离开后由于惯性继续滑动
public static int SCROLL_STATE_FLING = 2;
//状态改变时回调,第二个参数为以上的状态
public void onScrollStateChanged(AbsListView view, int scrollState);
//在滚动时一直回调
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount,
int totalItemCount);
}
2、ListView的常用拓展
具有弹性的ListView
控制滑动到边缘的方法overScrollBy
修改maxOverScrollBy数值实现
自动显示隐藏布局的ListView
向上滑动隐藏ActionBar,向下恢复
应用事件监听,判断往上还是下
聊天ListView
主要是ViewType
9-patch图制作
第一行代码有详细例子
动态改变ListView布局
视图叠加
重写getViewType