• 5-VI--ListView事件全解析


    零、前言

    [0.]本案例使用这篇的项目(你也可以用其他的):4-VI--☆ListView的封装支持多种条目
    [1].条目点击事件
    [2].条目长按事件
    [3].滑动事件
    [4].条目抢占交点问题

    一、条目点击事件:setOnItemClickListener

    几个参数----根据图片参照对应:
    parent:背景变成淡绿色
    view:背景变成随机颜色
    position:弹出来
    下面未点击的变色了,可见条目已正常复用

    9414344-45c1556d344ca2cb.gif
    listview点击.gif
    设置点击监听
     mLv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
                /**
                 *
                 * @param parent ListView
                 * @param view 条目
                 * @param position 位置
                 * @param id id 测试Id和 position一样
                 */
                @Override
                public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                    Log.e(TAG, "onItemClick() called with:
     "
                            + "parent = [" + parent + "], 
    " +
                            "view = [" + view + "],
     " +
                            "position = [" + position + "],
    " +
                            " id = [" + id + "]");
                    parent.setBackgroundColor(0x5500ff00);
                    view.setBackgroundColor(ColUtils.randomColor());
                    ToastUtil.showAtOnce(ChatActivity.this, "当前位置:" + position);
                }
            });
    

    一、条目长按事件:setOnItemLongClickListener

    几个参数和点击一样
    值得注意的一点是返回值:
    true: 手指抬起时不触发条目的点击事件
    false: 手指抬起时触发条目的点击事件

    设置长按监听
    mLv.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
        @Override
        public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
            ToastUtil.showAtOnce(ChatActivity.this, "长按--当前位置:" + position);
            return true;
        }
    });
    

    三、滑动事件:setOnScrollListener

    有两个回调方法:
    onScrollStateChanged(AbsListView view, int scrollState)
    onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount)

    1.onScrollStateChanged方法:view对象滑动时蓝色,滑动停止淡绿色
    9414344-93efa4f40f6fe5f4.gif
    listview滑动.gif
     mLv.setOnScrollListener(new AbsListView.OnScrollListener() {
                /**
                 *
                 * @param view ListView
                 * @param scrollState 上滑 1 滑动结束 0
                 */
                @Override
                public void onScrollStateChanged(AbsListView view, int scrollState) {
                    view.setBackgroundColor(scrollState == 0 ? 0x5500ff00 : 0x550000ff);
                }
                
                @Override
                public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
                }
            });
    
    2.onScroll:android.widget.AbsListView.OnScrollListener#onScroll
    /**
     *
     * @param view view ListView
     * @param firstVisibleItem 最顶端条目的id
     * @param visibleItemCount 可见的条目数
     * @param totalItemCount 总条目数
     */
    @Override
    public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
        mIsLastItem = visibleItemCount + firstVisibleItem == totalItemCount;
        mIsTopItem = firstVisibleItem == 0;
    }
    
    3.基于此实现监听滑到顶端和底端
    9414344-3daca85ca3e048a7.gif
    滑动到上下端监听.gif
        /**
         * 是否滑到最底端
         */
        private boolean mIsLastItem;
    
        /**
         * 是否滑到最顶端
         */
        private boolean mIsTopItem;
    
            mLv.setOnScrollListener(new AbsListView.OnScrollListener() {
    
                @Override
                public void onScrollStateChanged(AbsListView view, int scrollState) {
                    view.setBackgroundColor(scrollState == 0 ? 0x5500ff00 : 0x550000ff);
                    if (scrollState == 0) {
                        if (mIsLastItem) {
                            ToastUtil.show(ChatActivity.this, "滑到最底端");
                        }
                        if (mIsTopItem) {
                            ToastUtil.show(ChatActivity.this, "滑到最顶端");
                        }
                    }
                }
    
                @Override
                public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
    
                    mIsLastItem = visibleItemCount + firstVisibleItem == totalItemCount;
                    mIsTopItem = firstVisibleItem == 0;
                }
            });
    

    四、条目抢占交点问题

    只在一类布局上加上CheckBox,看图对比

    9414344-a42fb41a0e7cc78e.gif
    交点抢占.gif
    1.设置适配器的setData方法里可以获取条目内的布局:case 0:
    CheckBox checkBox = (CheckBox) holder.getView(R.id.id_cb_left);
    checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
        @Override
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
            ToastUtil.showAtOnce(ChatActivity.this,
                    "状态改变为:"+(isChecked?"已选择":"未选中"));
        }
    });
    
    2.解决:让checkbox默认不抢焦点
    checkBox.setFocusable(false);
    
    9414344-6cecbb9ef80773ad.gif
    抢占交点解决.gif

    后记、

    1.声明:

    [1]本文由张风捷特烈原创,转载请注明
    [2]欢迎广大编程爱好者共同交流
    [3]个人能力有限,如有不正之处欢迎大家批评指证,必定虚心改正
    [4]你的喜欢与支持将是我最大的动力

    2.连接传送门:

    更多安卓技术欢迎访问:安卓技术栈
    我的github地址:欢迎star
    简书首发,腾讯云+社区同步更新
    张风捷特烈个人网站,编程笔记请访问:http://www.toly1994.com

    3.联系我

    QQ:1981462002
    邮箱:1981462002@qq.com
    微信:zdl1994328

    4.欢迎关注我的微信公众号,最新精彩文章,及时送达:
    9414344-c474349cd3bd4b82.jpg
    公众号.jpg
  • 相关阅读:
    WebDAV
    招牌老鸭汤(图)-张生记(双菱店)-杭州-大众点评网
    How to install and use Headless Chrome on OSX | Object Partners
    k8s的yaml说明
    config-server-bus动态更新配置
    springboot~maven集成开发里的docker构建
    vue~环境搭建
    logback日志文件位置动态指定
    HDU 4649 Professor Tian(反状态压缩dp,概率)
    android 内部存储 安装apk
  • 原文地址:https://www.cnblogs.com/toly-top/p/9781928.html
Copyright © 2020-2023  润新知