Android 彻底征服 ListView 一 (实用篇)

ListView使用技巧

对于Android开发,相信ListView这个控件大家一定不会陌生,它的重要性不言而喻,它的功能纷繁复杂,在项目中的表现形式灵活多变,要想得心应手的使用不并容易,今天带领大家一起领略ListView的风采.

1.使用ViewHolder

 @Override
    public View getView(int i, View view, ViewGroup viewGroup) {
        ViewHolder holder;
        if(view==null){
            holder=new ViewHolder();
            view=mInflater.inflate(R.layout.viewholdernotifyadapter,null);
            holder.img= (ImageView) view.findViewById(R.id.imageView);
            holder.title= (TextView) view.findViewById(R.id.textView);
            view.setTag(holder);
        }else{
            holder= (ViewHolder) view.getTag();
        }
        holder.img.setImageResource(R.mipmap.ic_launcher);
        holder.title.setText(mData.get(i));
        return view;
    }
    public final class ViewHolder{
        private ImageView img;
        private TextView title;
    }

2.设置项目间分隔线

android:divider="@android:color/darker_gray"//设置分割线
android:dividerHeight="10dp"//设置分隔线高度
android:divider="@null"//隐藏分割线

3.隐藏ListView的滚动条

android:scrollbars="none"//隐藏ListView滚动条

4.取消ListView的Item点击效果

android:listSelector="@android:color/transparent"//取消ListView的Item点击效果

5.设置ListView需要显示在第几项

listView.setSelection(N);//默认显示在第N个Item,(N为第N个Item)(瞬时完成)
//平滑移动
mListView.smoothScrollBy(distance,duration);
mListView.smoothScrollByOffset(offset);
mListView.smoothScrollToPosition(index);

6.动态修改ListView

使用adapter.notifyDataSetChanged();通知ListView更改数据源对ListView动态修改,必须保证传入Adapter的数据List是同一个List而不能是其他对象,否则无法实现该效果

 public void btnAddItem(View view){
        mData.add("哈哈哈");
        adapter.notifyDataSetChanged();//通知Adapter更新数据
        listView.setSelection(mData.size()-1);
    }

7.遍历ListView中的所有Item

通过getChildAt()来获取第i个子View.

 for (int i = 0; i < listView.getChildCount(); i++) {
            View view = listView.getChildAt(i);
        }

8.处理空ListView

通过setEmptyView(),在LiseView无数据的情况下显示默认的提示

 <FrameLayout
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1">

        <ListView
            android:id="@+id/listView"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:divider="@android:color/darker_gray"
            android:dividerHeight="10dp"
            android:listSelector="@android:color/transparent"
            android:scrollbars="none"></ListView>

        <ImageView
            android:id="@+id/empty_view"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:src="@mipmap/ic_launcher" />
    </FrameLayout>
ListView listView = (ListView) findViewById(R.id.listView);
listView.setEmptyView(findViewById(R.id.empty_view));

9.ListView滑动监听

监听ListView滑动事件的方法主要有两种:一个是通过OnTouchListener来实现监听,另一个是使用OnScrollListener来实现监听,通常还需要使用GestureDetector手势识别,VelocityTracker滑动速度检测来实现更好监听.

9.1 OnTouchListener

OnTouchListener是View中的监听事件,通过监听 ACTION_DOWN ACTION_MOVE ACTION_UP 这三个事件发生时的坐标,判断用户滑动的方向,在不同的事件中进行相应的逻辑处理.

 mListView.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View view, MotionEvent motionEvent) {
                switch (motionEvent.getAction()) {
                    case MotionEvent.ACTION_DOWN:
                        //触摸时操作
                        break;
                    case MotionEvent.ACTION_MOVE:
                        //移动时操作
                        break;
                    case MotionEvent.ACTION_UP:
                        //离开时操作
                        break;
                }
                return false;
            }
        });

9.2 OnScrollListener

OnScrollListener是AbsListView中的监听事件

   mListView.setOnScrollListener(new AbsListView.OnScrollListener() {
            @Override
            public void onScrollStateChanged(AbsListView absListView, int scrollState) {
                switch (scrollState) {
                    case AbsListView.OnScrollListener.SCROLL_STATE_IDLE:
                        //滑动停止时
                        Log.d("tag", "SCROLL_STATE_IDLE");
                        break;
                    case AbsListView.OnScrollListener.SCROLL_STATE_TOUCH_SCROLL:
                        //正在滚动
                        Log.d("tag", "SCROLL_STATE_TOUCH_SCROLL");
                        break;
                    case AbsListView.OnScrollListener.SCROLL_STATE_FLING:
                        //手指抛动时  即手指用力滑动  在离开后ListView由于惯性继续滑动
                        Log.d("tag", "SCROLL_STATE_FLING");
                        break;
                }
            }
            @Override
            public void onScroll(AbsListView absListView, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
                //滚动时一直调用
                Log.d("tag", "onScroll");
            }
        });

OnScrollListener中有两个回调方法–onScrollStateChanged()和onScroll().
onScrollStateChanged()根据它的参数scrollState来决定其回调的次数,scrollState有以下三种模式:

OnScrollListener.SCROLL_STATE_IDLE:滚动停止时.
OnScrollListener.SCROLL_STATE_TOUCH_SCROLL:正在滚动时.
OnScrollListener.SCROLL_STATE_FLING:手指抛动时,即手指用力滑动,在离开后ListView由于惯性继续滑动的状态.

没有抛动状态时,回调2次,否则回调3次.
onScroll()在ListView滚动时一直回调,它有3个参数可以非常精确地显示当前ListView的滚动状态,

firstVisibleItem:当前能看见的第一个Item的ID(从0开始).
visibleItemCount:当前能看见的Item总数.
totalItemCount:整个ListView的Item总数.

当前能看见的Item数,包括没有显示完整的Item,即显示一小半的Item也包括在内.

//判断是否滚动到最后一行
//当前可视的另一个Item的ID加上当前可视Item的和等于Item总数的时候,即滚动到了最后一行.
if (firstVisibleItem + visibleItemCount == totalItemCount && totalItemCount > 0) {
                    //滚动到最后一行
    }
//判断滚动的方向
//通过一个成员变量lastVisibleItemPosition来记录上次第一个可视的Item的ID并与当前的可视Item的ID进行比较,即可知道当前滚动的方向
if (firstVisibleItem > lastVisibleItemPosition) {
                    //上滑
     } else if (firstVisibleItem < lastVisibleItemPosition) {
                    //下滑
    }
lastVisibleItemPosition = firstVisibleItem;
//获取可视区域内最后一个Item的id
mListView.getLastVisiblePosition();
//获取可视区域内第一个Item的id
mListVIew.geFirstVisiblePosition();

ListView例子下载链接

未完待续…

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值