
正文
Android ListView 常用技巧
提示:扫一扫查出行【扫一扫了解最新限行尾号】
复制提示
| Android ListView 常用技巧 | |
| Android TextView 常用技巧 |
1.使用ViewHolder提高效率
ViewHolder模式充分利用了ListView的视图缓存机制,避免了每次在调用getView()的时候都去通过findViewById()实例化控件。需要做的就是在自定义Adapter中定义一个内部类ViewHolder,并将布局中的控件作为成员变量。代码如下:
public final class ViewHolder { public ImageView img; public TextView title;}
接下来,只需要在getView()方法中通过视图缓存机制来重用以缓存即可,在getView()中使用Holder的实例代码如下:
@Overridepublic View getView(int position, View convertView, ViewGroup parent) { ViewHolder holder = null; // 判断是否缓存 if (convertView == null) { holder = new ViewHolder(); // 通过LayoutInflater实例化布局 convertView = LayoutInflater.from(context).inflate(R.layout.viewholder_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;}
2.设置Item间分割线
ListView的各个Item之间,可以通过设置分割线来进行区分,系统提供了divider 和 dividerHeight两个属性来帮助我们实现这个功能。我们不仅仅能够控制分割线的颜色和高度,同样我们也可以将分割线设置为一个图片资源,分割线的使用代码如下:
android:divider="@android:color/draker_gray"android:dividerHeight="10dp"
如果我们想将分割线设置为透明(就是分割线不可见,但是可以设置高度)。
android:divider="@null"
3.隐藏ListView的滚动条
默认的ListView在滚动时,右边会显示滚动条,指示当前滑动的位置,我们可以设置ScrollView属性,控制ListView的滚动条状态,当设置其属性为none的时候ListView滚动或者不滚动都不会出现滚动条了,代码如下:
android:scrollbars="none"
4.取消ListView的Item点击效果
在点击ListView中的一项的时候,系统默认会出现一个点击效果,在Android 5.X上是一个波纹效果,而在Android 5.X以下的版本则是一个改变背景颜色的效果,但是可以通过修改listSelector属性来取消点击后的反馈效果,代码如下
android:listSelector="#00000000"
或者使用Android自带的透明色来实现:
android:listSelector="@android:color/transparent"
5.设置ListView需要在显示在第几项
ListView以Item为单位进行显示,默认显示在第一个Item,当需要指定具体显示的Item时,可以通过如下代码来实现:
listView.setSelection(N);
这个方法类似于scrollTo,是瞬间完成的移动,除此之外,可以使用如下代码来实现平滑移动:
mListView.smoothScrollBy(distance, duration)p;mListView.smoothScrollByOffset(offset);mListView.smoothScrollToPosition(index);
6.处理空ListView
ListView用于展示列表数据,但当列表无数据是,ListView不会展示任何数据或提示,按照完善用户体验的要求,这里应该给以无数据的提示。好在ListView的父类AdapterView提供了方法---setEmptyView(),通过这个方法我们可以给ListView设置一个空数据下的默认显示。
7.ListView滑动监听
ListView的滑动监听,是ListView使用中比较重要的技巧,很多重写的ListView,基本上都是在滑动事件的处理上下功夫,通过滑动时间进行不同的逻辑处理。而为了更加精确的监听滑动事件,开发者通常还需要使用GestureDetector手势识别、VelocityTracker滑动速度检测等辅助来完成更好的监听。这里介绍两种监听ListView的方法,一个是通过OnTouchListener来实现监听,另一个是使用OnScrollListener来监听。
(1).OnTouchListener
OnTouchListener是View的监听事件,通过监听ACTION_DOWN,ACTION_MOVE,ACTION_UP这三个事件发生时的坐标,就可以根据坐标判断用户滑动的方向,并在不同的事件中进行相应的处理逻辑,使用的代码如下:
mListView.setOnTouchListener(new View.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
OnScrollListener是AbsListView中的监听事件,它封装了很多ListView相关的信息,使用起来较为灵活:
mListView.setOnScrollListener(new OnScrollListener() { @Override public void onScrollStateChanged(AbsListView view, int scrollState) { switch(scrollState) { case OnScrollListener.SCROLL_STATE_IDLE: // 滑动停止时 break; case OnScrollListener.SCROLL_STATE_TOUCH_SCROLL: // 正在滚动 break; case OnScrollListener.SCROLL_STATE_TOUCH_SCROLL: // 手指抛动时,即手指用力滑动 // 在离开后ListView由于惯性继续滑动 break; } } @Override public void onScroll(AbsListView view, int firstItem, int visibleItemCount, int totalItemCount) { /// 滚动时一直调用 }});





