Android开发Android开发经验谈Android开发

Android-GridView 的 OnItemClickLi

2018-12-06  本文已影响4人  d74f37143a31

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

GridView 的 OnItemClickListener 的事件无响应情况

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

解决办法:

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

伪代码如下:

// 自己实现接口
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的属性值有三种:

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”, 如果都点击不了,设置焦点有什么作用呢?

上一篇下一篇

猜你喜欢

热点阅读