常用优化技巧
使用ViewHolder
ViewHolder利用了ListView的视图缓存机制,避免每次getView的时候都去重新实例化对象,提高效率。
设置项目分割线
使用android:divider属性设置分割线 设置@null为透明分割线
dividerHeight属性设置分割线的高度
隐藏滚动条
android:scrollbars=”none”
取消Item点击效果
android:itemSelector=”#00000000” //透明色
设置显示第几项
listView.setSelection(N);
动态添加Item
当Adapter中设置的List元素增添之后
可以使用notifyDataSetChange()来刷新数据。
如果List引用和以前的不一致,是无法刷新的。
设置空View
在ListView同级设置一个ImageView。
使用listView.setEmpty(view)即可。
滑动监听
onTouchListener
onScrollerListener
firstVisibleItem 第一个显示的View的编号
lastVisibleItem 上次第一个显示的View的编号
visibleItemCount 显示的Item个数
totalItemCount 总共的Item个数
判断到了最后一行:
firstVisibleItem + visibleItemCount == totalItemCount && totalItemCount > 0
ListView常用拓展
具有弹性的ListView
继承ListView ,重写overScrollBy方法,修改super中的参数maxOverScrollY为一个具体的数值,就可以给ListView添加指定高度的弹性效果了。
自动显示,隐藏布局的ListView
通过使用Toolbar+重写listView的onTouch方法可以实现
lv.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View view, MotionEvent motionEvent) {
switch (motionEvent.getAction()){
case MotionEvent.ACTION_DOWN:
mFirst = motionEvent.getY();
break;
case MotionEvent.ACTION_MOVE:
mCurrent = motionEvent.getY();
Log.d("lfz",mCurrent+"");
if(mCurrent - mFirst > mTouchSlop){
direction = 0; //down
}else if(mFirst - mCurrent > mTouchSlop){
direction = 1; //up
}
if(direction == 1){
if(mShow){
toolbarAnim(0); //显示
mShow = !mShow;
}
}else if(direction == 0){
if(!mShow){
toolbarAnim(1); //隐藏
mShow = !mShow;
}
}
break;
}
return false;
}
});
private void toolbarAnim(int i) {
if(mAnimator != null && mAnimator.isRunning()){
mAnimator.cancel();
}
if(i == 1){
//显示
mAnimator = ObjectAnimator.ofFloat(toolbar,"translationY",toolbar.getTranslationY(),0);
}else{
//隐藏
mAnimator = ObjectAnimator.ofFloat(toolbar,"translationY",toolbar.getTranslationY(),-toolbar.getHeight());
}
mAnimator.start();
}
动态改变ListView布局
在Item被点击的时候有一个focus效果,可以使用不同ItemType来完成效果。
/**
* Created by Administrator on 2017/10/9.
* 实现不同点击效果的Adapter
*/
public class FocusAdapter extends BaseAdapter {
private List<String> mData;
private Context context;
private int mCurrentItem = -1;
public void setCurrentItem(int mCurrentItem) {
this.mCurrentItem = mCurrentItem;
}
public FocusAdapter(List<String> mData, Context context) {
this.mData = mData;
this.context = context;
}
@Override
public int getCount() {
return mData.size();
}
@Override
public Object getItem(int i) {
return mData.get(i);
}
@Override
public long getItemId(int i) {
return i;
}
@Override
public int getViewTypeCount() {
return 2;
}
@Override
public int getItemViewType(int position) {
return mCurrentItem == position?1:0;
}
@Override
public View getView(int i, View view, ViewGroup viewGroup) {
ViewHolder viewHolder;
if(view == null){
viewHolder = new ViewHolder();
switch (getItemViewType(i)) {
case 0:
view = LayoutInflater.from(context).inflate(R.layout.item_normal, viewGroup, false);
break;
case 1:
view = LayoutInflater.from(context).inflate(R.layout.item_focus, viewGroup, false);
break;
}
viewHolder.tv_title = view.findViewById(R.id.item_title);
view.setTag(viewHolder);
}else{
viewHolder = (ViewHolder) view.getTag();
}
viewHolder.tv_title.setText(mData.get(i));
return view;
}
class ViewHolder{
TextView tv_title;
}
}