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