Android-GridView 的 OnItemClickLi

作者: d74f37143a31 | 来源:发表于2018-12-06 16:48 被阅读4次

    GridView 的 OnItemClickListener 的事件无响应情况
    RecyclerView 抢占焦点
    EditText 默认不获取焦点

    GridView 的 OnItemClickListener 的事件无响应情况

    GridView 的 OnItemClickListener 的事件无响应情况:
    网上说是因为:
    listview、GridView 的子元素中包含了 Button 或者 ImageButton 之类的控件, 此类控件的优先级高于 Listview 、GridView 所以不能监听 Item 的点击事件。

    解决办法:

    • Item 的根节点加入 “android:descendantFocusability="blocksDescendants"

    • 将xxxButton 换成 TextView 等普通 View

    • 设置 ItemView clickable 为 FALSE;

    • 设置 GridView : descendantFocusability="blocksDescendants"

    • 设置 GridView 的 Focusable 为true

    奈何尝试了上面办法后还是不成功,后来改为自定义接口实现点击事件,解决。

    伪代码如下:

    // 自己实现接口
    public interface GridViewListener{
        void onItemClick(int position);
    }
    private GridViewListener listener;
    public void setOnGridViewItemClickListner(GridViewListener listner){
        this.listener = listner;
    }
    // item 点击
    convertView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if (listener != null){
                listener.onItemClick(position);
            }
        }
    });
    // 调用
    gridAdapter.setOnGridViewItemClickListner(new HomeGridAdapter.GridViewListener() {
        @Override
        public void onItemClick(int position) {
            Log.e(TAG, "onItemClick: ------------->>>" );
        }
    });
    

    上面提到了android:descendantFocusability,这东西的作用是什么呢?

    android:descendantFocusability 的该属性是当一个为view 获取焦点时,定义viewGroup和其子控件两者之间的关系。

    android:descendantFocusability的属性值有三种:

    • beforeDescendants:viewgroup 会优先其子类控件而获取到焦点
    • afterDescendants:viewgroup 只有当其子类控件不需要获取焦点时才获取焦点
    • blocksDescendants:viewgroup 会覆盖子类控件而直接获得焦点

    RecyclerView 抢占焦点、EditText 默认不获取焦点

    在父布局添加:

    android:focusable="true"
    android:focusableInTouchMode="true"
    

    focusableInTouchMode 表示可以通过触摸获取焦点

    android:focusable=“true”不会改变android:focusableInTouchMode,因此只在键盘状态下显示焦点,在TouchMode状态下,依旧无法显示焦点。

    TouchMode顾名思义就是“触摸模式”。Android系统的交互方式有方向键、滚动球和触摸几种方式。采用方向键、滚动球等方式操作,需要通过焦点和高亮来表示此时操作的view;如果设备具备触摸能力,就可以通过触摸而不需要view高亮,这种触摸的交互方式就是touch mode参考-说说Android中的touch mode

    android:focusable=“false”,一定会使android:focusableInTouchMode=“false”

    相对的

    android:focusableInTouchMode=“false”,不会影响android:focusable

    android:focusableInTouchMode=”true”,一定会是android:focusable=“true”

    所有的获取焦点,都要有一个前提,该控件必须是可点击的,也就是该控件的clickable属性为true, android:clickable=”true”, 如果都点击不了,设置焦点有什么作用呢?

    相关文章

      网友评论

        本文标题:Android-GridView 的 OnItemClickLi

        本文链接:https://www.haomeiwen.com/subject/xnvocqtx.html