专栏首页Android知识点总结5-VI--ListView事件全解析

5-VI--ListView事件全解析

零、前言

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

一、条目点击事件:setOnItemClickListener

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

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:\n "
                        + "parent = [" + parent + "], \n" +
                        "view = [" + view + "],\n " +
                        "position = [" + position + "],\n" +
                        " 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对象滑动时蓝色,滑动停止淡绿色

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.基于此实现监听滑到顶端和底端

滑动到上下端监听.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,看图对比

交点抢占.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);

抢占交点解决.gif

本文由张风捷特烈原创,转载请注明 更多安卓技术欢迎访问:https://www.jianshu.com/c/004f3fe34c94 张风捷特烈个人网站,编程笔记请访问:http://www.toly1994.com 你的喜欢与支持将是我最大的动力

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • View篇:玩一下自定义ViewGroup

    张风捷特烈
  • RecyclerView零点突破(动画+边线篇)

    张风捷特烈
  • 06--图解数据结构之并查集

    张风捷特烈
  • PTA 输出全排列(20 分)

    7-2 输出全排列(20 分) 请编写程序输出前n个正整数的全排列(n<10),并通过9个测试用例(即n从1到9)观察n逐步增大时程序的运行时间。 输入格式: ...

    Kindear
  • hdu 1811 Rank of Tetris (并查集+拓扑排序)

    Rank of Tetris Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/327...

    Gxjun
  • 简单的通过demo了解C++的基础语法笔记

    许久未碰C++的相关内容,已经有些被大脑的程序执行Lru算法了,导致近期在做NDK开发的时候,各种操作卡顿,决心还是回忆整理一下相关的基础知识。

    包子388321
  • Educational Codeforces Round 65 (Rated for Div. 2) A-D

    rank是能够通知到的人的个数,比较当前这两个人谁能通知到的人较少,然后把能通知到的人较少的那个人的指向pre[a]指向b(假设a能通知到的人较少),这样是为了...

    用户2965768
  • 算法(六)二叉堆获取最小的k个数

    如果你有一个文件,里面包含20万行的整数,如何获取前k个最小的数?首先可以想到两个思路:

    一只羊
  • AtCoder Beginner Contest 118题解报告

    海天一树
  • LeetCode 220. Contains Duplicate III

    题解:当然可以O(nk)的效率,但是这样很low,我们可以用O(nlog(k))的效率去解决。

    ShenduCC

扫码关注云+社区

领取腾讯云代金券