ViewHolder模式充分利用了ListView的视图缓存机制,避免了每次在调用getView()的时候都去通过findViewById()实例化控件。
在自定义Adapter中定义一个内部类ViewHolder,并将布局中的控件作为成员变量。
public final class ViewHolder{
public ImageView img;
public TextView title;
}
在getView中这么写:
ViewHolder Holder = null;
if(null == convertView){
holder = new ViewHolder();
convertView = inflate(R.layout.viewholder_item,null);
holder.img = convertView.findViewById(R.id.imageView);
holder.title = convertView.findViewById(R.id.textView);
convertView.setTag(holder);
}else{
holder = (ViewHolder)convertView.getTag();
}
holder.img.setBackgroundResource(R.drawable.ic_launcher);
holder.title.setText(sss);
return convertView;
}
android:divider="@android:color/darker_gray"
android:dividerHeight="10dp"
当想要设置分割线为透明时:
android:divider=”@null”
android:scrollbars="none"
android:listSelector="#00000000"
或者用Android自带的透明色来实现这个效果
android:listSelector="@android:color/transparent"
ListView以Item为单位进行显示,默认显示在第一个Item,当需要指定具体的Item时,可以通过如下代码来实现
listView.setSelection(N);
还可以通过如下代码来实现平滑移动:
mListView.smoothScrollBy(distance,duration);
mListView.smoothScrollByOffset(offset);
mListView.smoothScrollToPosition(index);
mData.add("new");
mAdapter.notifyDataSetChanged();
for(int i = 0; i < mListView.getChildCount; i++){
View view = mListView.getChildAt(i);
}
在代码中,我们可以通过以下方式给ListView设置空数据时要显示的布局,代码如下所示。
ListView listView = (ListView)findViewById(R.id.listView);
listview.setEmptyView(findViewById(R.id.empty_view));
包含ListView的布局设置如下:
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android">
<ListView ..../>
<ImageVIew ...
android:id = "@+id/empty_view"
/>
</FrameLayout>
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;
}
});
OnScrollListener
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_FLING:
//手指抛动时,即手指用力滑动
//在离开后ListView由于惯性继续滑动的状态
break;
}
}
@Override
public void onScroll(AbsListView view,int firstVisibleItem,int visibleItemCount,int totalItemCount){
//滑动时一直调用
}
});
通过onScroll方法,我们可以得到好多有用的信息。比如:
判断是不是滚动到最后一行
if(firstVisibleItem + visibleItemCount == totalItemCount && totalItemCount > 0){
}
可以判断是上滑还是下滑
if(firstVisibleItem > lastVisibleItemPosition){
//上滑
}else if(firstVisibleItem < lastVisibleItemPosition){
//下滑
}
lastVisibleItemPosition = firstVisibleItem;
ListView还给我们提供了一些封装的方法:
// 获取可见区域内最后一个Item的id
listView.getLastVisiblePosition()
//获取可见区域内第一个Item的id
listView.getFirstVisiblePosition()
重写overScrollBy方法,改变maxOverScrollY参数的值,该值默认为0。