Android群英传学习——ListView优化

常用优化技巧

使用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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值