Android ListView 使用相关技巧

1.使用ViewHolder来提高效率:避免每次调用getView()的时候通过findViewById()实例化控件(在自定义的Adapter中定义一个内部类ViewHolder)

2.设置item的间隔:系统提供了

android:divider="@android:color/darker_gray"
        android:dividerHeight="10dp"
提示:不仅仅设置颜色,还可以设置图片哦,当设置为这样时没有间隔线
android:divider="@null"

3.隐藏listview滚动条

android:scrollbars="none"

4.item点击效果

android:listSelector="@android:color/transparent"

5.显示在第N个item

listView.setSelection(n);

6.处理空的listView(即当listview相关的Data集合或数组没有数据时,也是Adapter中的getCount()返回0时)

listView.setEmptyView(findViewById(R.id.textView));

7.滑动监听
7.1通过onTouchListener

listView.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View view, MotionEvent motionEvent) {
                switch (motionEvent.getAction()){
                    case MotionEvent.ACTION_DOWN:
                        mFirstY = motionEvent.getY();
                        break;
                    case MotionEvent.ACTION_MOVE:
                        mCurrentY = motionEvent.getY();
                        if(mCurrentY - mFirstY > mTouchSlop){
                            //down
                        }else if(mFirstY - mCurrentY > mTouchSlop){
                            //up
                        }
                        break;
                }
                return false;
            }
        });
提示:mTouchSlop是定义的系统认为最低的滑动距离
mTouchSlop = ViewConfiguration.get(this).getScaledPagingTouchSlop();
7.2通过OnScrollListener
listView.setOnScrollListener(new AbsListView.OnScrollListener() {
            @Override
            public void onScrollStateChanged(AbsListView absListView, int i) {

            }

            @Override
            public void onScroll(AbsListView absListView, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
                if(firstVisibleItem + visibleItemCount == totalItemCount && totalItemCount >0){
                    Log.e("TAG", "到最后一行");
                }
                if(firstVisibleItem > lastVisibleItemPosition){
                    Log.e("TAG", "向上滑动");//show
                }else if(firstVisibleItem < lastVisibleItemPosition){
                    Log.e("TAG", "向下滑动");//hide;
                }
                lastVisibleItemPosition = firstVisibleItem;//lastVisibleItemPosition是成员变量(用于记录)
            }
        });

8.弹性的listview:(修改一个参数即可)
自定义listview并重写 overScrollBy(int deltaX, int deltaY, int scrollX, int scrollY, int scrollRangeX, int scrollRangeY, int maxOverScrollX, int maxOverScrollY, boolean isTouchEvent)方法

@Override
    protected boolean overScrollBy(int deltaX, int deltaY, int scrollX, int scrollY, int scrollRangeX, int scrollRangeY, int maxOverScrollX, int maxOverScrollY, boolean isTouchEvent) {
        return super.overScrollBy(deltaX, deltaY, scrollX, scrollY, scrollRangeX, scrollRangeY, maxOverScrollX, elasticDistance, isTouchEvent);
    }
提示:修改的就是其中的maxOverScrollY --> elasticDistance参数,

为了能满足多分辨率

private void init(Context context) {
        DisplayMetrics metrics = context.getResources().getDisplayMetrics();
        float density = metrics.density;
        elasticDistance = (int)(elasticDistance * density);//elasticDistance = 500(可自定义数值)
    }
tip:不要忘记在自定义的listview的构造器中调用init(Context context)哦

9.分类型的listview(例如:QQ微信,聊天布局的实现)
这里写图片描述
其实就主要用两个方法在自定义的Adapter中

@Override
            public int getItemViewType(int position) {
                int x =0;
                if(position%2 == 0){
                    x = 0;
                }else{
                    x =1;
                }
                return x;
            }

            @Override
            public int getViewTypeCount() {
                return 2;
            }


            @Override
            public View getView(int i, View view, ViewGroup viewGroup) {
                if(getItemViewType(i) == 1){
                    view = LayoutInflater.from(Main2Activity.this).inflate(R.layout.in,null);
                }else{
                    view = LayoutInflater.from(Main2Activity.this).inflate(R.layout.out,null);
                }
                return view;
            }
 tip:getItemViewType()用来返回第position个item是什么类型
     getViewTypeCount()用来返回类型的总数
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值