Android群英传学习——ListView优化

来源:互联网 发布:dnf提示框源码 编辑:程序博客网 时间:2024/05/22 11:30

常用优化技巧

使用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;    }}
阅读全文
0 0
原创粉丝点击