ListView使用技巧
对于Android开发,相信ListView这个控件大家一定不会陌生,它的重要性不言而喻,它的功能纷繁复杂,在项目中的表现形式灵活多变,要想得心应手的使用不并容易,今天带领大家一起领略ListView的风采.
1.使用ViewHolder
@Override
public View getView(int i, View view, ViewGroup viewGroup) {
ViewHolder holder;
if(view==null){
holder=new ViewHolder();
view=mInflater.inflate(R.layout.viewholdernotifyadapter,null);
holder.img= (ImageView) view.findViewById(R.id.imageView);
holder.title= (TextView) view.findViewById(R.id.textView);
view.setTag(holder);
}else{
holder= (ViewHolder) view.getTag();
}
holder.img.setImageResource(R.mipmap.ic_launcher);
holder.title.setText(mData.get(i));
return view;
}
public final class ViewHolder{
private ImageView img;
private TextView title;
}
2.设置项目间分隔线
android:divider="@android:color/darker_gray"//设置分割线
android:dividerHeight="10dp"//设置分隔线高度
android:divider="@null"//隐藏分割线
3.隐藏ListView的滚动条
android:scrollbars="none"//隐藏ListView滚动条
4.取消ListView的Item点击效果
android:listSelector="@android:color/transparent"//取消ListView的Item点击效果
5.设置ListView需要显示在第几项
listView.setSelection(N);//默认显示在第N个Item,(N为第N个Item)(瞬时完成)
//平滑移动
mListView.smoothScrollBy(distance,duration);
mListView.smoothScrollByOffset(offset);
mListView.smoothScrollToPosition(index);
6.动态修改ListView
使用adapter.notifyDataSetChanged();通知ListView更改数据源对ListView动态修改,必须保证传入Adapter的数据List是同一个List而不能是其他对象,否则无法实现该效果
public void btnAddItem(View view){
mData.add("哈哈哈");
adapter.notifyDataSetChanged();//通知Adapter更新数据
listView.setSelection(mData.size()-1);
}
7.遍历ListView中的所有Item
通过getChildAt()来获取第i个子View.
for (int i = 0; i < listView.getChildCount(); i++) {
View view = listView.getChildAt(i);
}
8.处理空ListView
通过setEmptyView(),在LiseView无数据的情况下显示默认的提示
<FrameLayout
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1">
<ListView
android:id="@+id/listView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:divider="@android:color/darker_gray"
android:dividerHeight="10dp"
android:listSelector="@android:color/transparent"
android:scrollbars="none"></ListView>
<ImageView
android:id="@+id/empty_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:src="@mipmap/ic_launcher" />
</FrameLayout>
ListView listView = (ListView) findViewById(R.id.listView);
listView.setEmptyView(findViewById(R.id.empty_view));
9.ListView滑动监听
监听ListView滑动事件的方法主要有两种:一个是通过OnTouchListener来实现监听,另一个是使用OnScrollListener来实现监听,通常还需要使用GestureDetector手势识别,VelocityTracker滑动速度检测来实现更好监听.
9.1 OnTouchListener
OnTouchListener是View中的监听事件,通过监听 ACTION_DOWN ACTION_MOVE ACTION_UP 这三个事件发生时的坐标,判断用户滑动的方向,在不同的事件中进行相应的逻辑处理.
mListView.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View view, MotionEvent motionEvent) {
switch (motionEvent.getAction()) {
case MotionEvent.ACTION_DOWN:
//触摸时操作
break;
case MotionEvent.ACTION_MOVE:
//移动时操作
break;
case MotionEvent.ACTION_UP:
//离开时操作
break;
}
return false;
}
});
9.2 OnScrollListener
OnScrollListener是AbsListView中的监听事件
mListView.setOnScrollListener(new AbsListView.OnScrollListener() {
@Override
public void onScrollStateChanged(AbsListView absListView, int scrollState) {
switch (scrollState) {
case AbsListView.OnScrollListener.SCROLL_STATE_IDLE:
//滑动停止时
Log.d("tag", "SCROLL_STATE_IDLE");
break;
case AbsListView.OnScrollListener.SCROLL_STATE_TOUCH_SCROLL:
//正在滚动
Log.d("tag", "SCROLL_STATE_TOUCH_SCROLL");
break;
case AbsListView.OnScrollListener.SCROLL_STATE_FLING:
//手指抛动时 即手指用力滑动 在离开后ListView由于惯性继续滑动
Log.d("tag", "SCROLL_STATE_FLING");
break;
}
}
@Override
public void onScroll(AbsListView absListView, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
//滚动时一直调用
Log.d("tag", "onScroll");
}
});
OnScrollListener中有两个回调方法–onScrollStateChanged()和onScroll().
onScrollStateChanged()根据它的参数scrollState来决定其回调的次数,scrollState有以下三种模式:
OnScrollListener.SCROLL_STATE_IDLE:滚动停止时.
OnScrollListener.SCROLL_STATE_TOUCH_SCROLL:正在滚动时.
OnScrollListener.SCROLL_STATE_FLING:手指抛动时,即手指用力滑动,在离开后ListView由于惯性继续滑动的状态.
没有抛动状态时,回调2次,否则回调3次.
onScroll()在ListView滚动时一直回调,它有3个参数可以非常精确地显示当前ListView的滚动状态,
firstVisibleItem:当前能看见的第一个Item的ID(从0开始).
visibleItemCount:当前能看见的Item总数.
totalItemCount:整个ListView的Item总数.
当前能看见的Item数,包括没有显示完整的Item,即显示一小半的Item也包括在内.
//判断是否滚动到最后一行
//当前可视的另一个Item的ID加上当前可视Item的和等于Item总数的时候,即滚动到了最后一行.
if (firstVisibleItem + visibleItemCount == totalItemCount && totalItemCount > 0) {
//滚动到最后一行
}
//判断滚动的方向
//通过一个成员变量lastVisibleItemPosition来记录上次第一个可视的Item的ID并与当前的可视Item的ID进行比较,即可知道当前滚动的方向
if (firstVisibleItem > lastVisibleItemPosition) {
//上滑
} else if (firstVisibleItem < lastVisibleItemPosition) {
//下滑
}
lastVisibleItemPosition = firstVisibleItem;
//获取可视区域内最后一个Item的id
mListView.getLastVisiblePosition();
//获取可视区域内第一个Item的id
mListVIew.geFirstVisiblePosition();
ListView例子下载链接
未完待续…