ListView使用总结(一)

本文详细介绍了ListView的常用接口及其功能,如getChildCount()和getCount()等,提供了计算ListView中item高度及总高度的方法,解决了ScrollerView与ListView的滑动冲突问题,并展示了如何监听ListView的滑动状态,最后给出了根据不同滑动位置判断和绘制引导箭头的策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

ListView接口函数
函数名作用
getChildCount()返回屏幕上显示的Item的个数
getCount()实际上是Adapter.getCount()返回总的item的个数可见不可见都算在内
getChildAt(int index)index从item中显示出来的第一项的下标(下标是指在item中的下标)开始计算
getFirstVisiblePosition()返回值是当前显示的第一个item的下标(在所有item中的位置)
getLastVisiblePosition()返回值是当前显示的最后一个item的下标(在所有的item中的下标)
View.getTop()item距离父控件的top值
ListView 获取某个item的高度并计算总高度
  • 在listView滚动的时候,根据显示的item的数目,通常会做出相应的导航动画,在使用中,我通过计算listView中item显示的多少,我来设置导航箭头的方向,并在header加载之后进行计算,因为在我的项目中header是在绑定数据之后就会刷新,所以加载header之后计算并不会影响太多的性能,所以在平时使用时需要将计算的方法放在性能影响小的地方
public int calItemHeight(ListView listView){
    int totalHeight = 0;
    ListAdapter listAdapter = listView.getAdapter();
    if(listAdapter == null){
        return 0;
    }
    for(int i = 0, size = listAdapter.getCount(); i < size; i++){
        View item = listAdapter.getView(i, null, listView);
        item.measure(0, 0);
        totalHeight += item.getMeasuredHeight();
    }
    return  totalHeight;
}
ScrollerView与ListView的滑动冲突
  • 滑动冲突:子View的滑动事件与父VIew的滑动事件的监听同时触发,ScrollerView和ListView的滑动冲突 导致ListView只会显示一行item
    • 解决方案:动态计算listView中的item的高度,再计算总高度
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_scroller_list_view_conflict);
    listView = (ListView)findViewById(R.id.listviewscroll);
    String[] arr = {
            "a",
            "b",
            "c",
            "d",
            "e",
            "f",
            "g"
    };
    ArrayAdapter arrayAdapter = new ArrayAdapter(this, R.layout.array_item, arr);
    listView.setAdapter(arrayAdapter);
    setListViewHeightBaseOnChildren(listView);
}


/**
* 动态计算ListView中的item的高度,在计算总高度
* @param listView
*/
public void setListViewHeightBaseOnChildren(ListView listView){
    ListAdapter listAdapter = listView.getAdapter();
    if(listAdapter == null){
        return;
    }
    int totalHeight = 0;
    for(int i = 0, size = listAdapter.getCount(); i < size; i++){
        View item = listAdapter.getView(i, null, listView);
        item.measure(0, 0);
        totalHeight += item.getMeasuredHeight();
    }
    ViewGroup.LayoutParams layoutParams = listView.getLayoutParams();
    layoutParams.height = totalHeight + (listView.getDividerHeight() * (listAdapter.getCount() - 1));
    layoutParams.height += 5;
    listView.setLayoutParams(layoutParams);
}

在这里插入图片描述

ListView.setOnScrollListener()

ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>(this, R.layout.array_item, arr);
    listView.setAdapter(arrayAdapter);
    listView.setOnScrollListener(new ListView.OnScrollListener() {
        /**
         * 监听ListView的滑动状态的改变,滑动存在三种状态
         * SCROLL_STATE_IDLE:ListView滑动停止 0
         * SCROLL_STATE_TOUCH_SCROLL:手指正在拖动ListVIew 1
         * SCROLL_STATE_FLING:ListView正在自由滑动 2
         * @param view
         * @param scrollState
         */
        @Override
        public void onScrollStateChanged(AbsListView view, int scrollState) {
            Log.d("WJX", "scrollState: "+ scrollState);
        }


        /**
         * @param view
         * @param firstVisibleItem:表示屏幕中第一条显示的数据(显示一点也计算在内)在adapter中的位置
         * @param visibleItemCount:表示屏幕中显示的数据的数目
         * @param totalItemCount:则是在adapter中的总条数
         */
        @Override
        public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
            Log.d("WJX", "firstVisibleItem:"+firstVisibleItem+" "+"visibleItemCount:"+visibleItemCount+" "+"totalItemCount:"+totalItemCount);
        }
    });
}
ListView判断滑动位置
  • 根据不同长度的ListView绘制引导箭头如果屏幕可以展示出所有的listView那么不需要引导箭头如果一屏显示不全,那么就显示向下的引导箭头如果一屏显示部分,且这部分是最下部的item,那么就需要显示向上的引导箭头
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {  
        if (firstVisibleItem == 0) {  
            View firstVisibleItemView = mListView.getChildAt(0);  
            if (firstVisibleItemView != null && firstVisibleItemView.getTop() == 0) {  
                //将箭头资源替换为向下的样式
            }  
        } else if ((firstVisibleItem + visibleItemCount) == totalItemCount) {  
            View lastVisibleItemView = mListView.getChildAt(mListView.getChildCount() - 1);  
            if (lastVisibleItemView != null && lastVisibleItemView.getBottom() == mListView.getHeight()) {  
                 //将箭头资源替换为向上样式
            }  
        }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wjxbless

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值