Android关于ListView中item与控件抢夺焦点的那些事

    • 在开发中,listview可以说是我们使用最频繁的控件之一了,但是关于listview的各种问题也是很多。当我们使用自定义布局的Listview的时候,如果在item的布局文件里面存在Button或者是CheckBox等控件以及其子类控件的时候,经常会碰到各种控件的点击事件冲突的情况,那么我们如何来处理Listview中这种控件之间焦点冲突的情况呢?

      我们以item存在一个Button控件为例

      首先,加入我们不设置任何关于焦点的属性,比如focus等,代码如下

      view sourceprint?

      01.@Override

      02.public View getView(int position, View convertView, ViewGroup parent) {

      03.convertView = inflater.inflate(R.layout.item, null);

      04.

      05.Button btnButton = (Button) convertView.findViewById(R.id.btn);

      06.btnButton.setOnClickListener(new OnClickListener() {

      07.

      08.@Override

      09.public void onClick(View v) {

      10.

      11.Toast.makeText(context, "点击了按钮"0).show();

      12.

      13.}

      14.});

      15.

      16.return convertView;

      17.}

      设置listview的OnitemClickListener事件

      view sourceprint?

      1.@Override

      2.public void onItemClick(AdapterView<?> parent, View view, int position, long id) {

      3.Toast.makeText(context, "点击了Item"0).show();

      4.}

      view sourceprint?

      1.

      那么在上面这种情况下,我们可以触发Button的点击事件,但是item的点击事件并不会被触发,也就是说,Button控件抢夺了item的焦点事件,使得item不能触发相应的点击事件,那么,如果我们既想触发Button的点击事件,又想触发item的点击事件,我们应该怎么做呢?

      这里有三种解决方案

      1.将ListView中的Item布局中的子控件focusable属性设置为false
      2.在getView方法中设置button.setFocusable(false)

      3.设置item的根布局的属性android:descendantFocusability="blocksDescendant"

      我们可以发现,其实这三种方法都是为了让Button等控件不能获取焦点,从而使得item可以响应点击事件。

      第三种方法使用起来相对方便,因为它是将item布局中的其他所有控件都设置为不能获取焦点。

      android:descendantFocusability属性共有三个取值,分别为

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

时间: 2024-10-03 14:46:17

Android关于ListView中item与控件抢夺焦点的那些事的相关文章

【Android进阶】关于ListView中item与控件抢夺焦点的那些事

在开发中,listview可以说是我们使用最频繁的控件之一了,但是关于listview的各种问题也是很多.当我们使用自定义布局的Listview的时候,如果在item的布局文件里面存在Button或者是CheckBox等控件以及其子类控件的时候,经常会碰到各种控件的点击事件冲突的情况,那么我们如何来处理Listview中这种控件之间焦点冲突的情况呢? 我们以item存在一个Button控件为例 首先,加入我们不设置任何关于焦点的属性,比如focus等,代码如下 @Override public

android 在布局中动态添加控件

第一步 Java代码 final LayoutInflater inflater = LayoutInflater.from(this); 第二步:获取需要被添加控件的布局 Java代码 final LinearLayout lin = (LinearLayout) findViewById(R.id.LinearLayout01); 第三步:获取需要添加的布局(控件) Java代码 LinearLayout layout = (LinearLayout) inflater.inflate( R

listView中的button控件获取索引

1.在listitem中初始化button的时候,给该button添加一个setTag方法,将此时的索引值传进去,然后在button的onclick事件中调用view的getTag方法,即可将listitem的索引读出来,代码如下: tagButton.setTag(position); 此处的tagButton就是定义的button,Position是view里边的位置. 2.初始化button的时候通过setTag方法传入一个item的索引值 private OnClickListener 

关于ListView中item与子控件抢夺焦点的解决方法

1.在开发中,listview可以说是我们使用最频繁的控件之一了,但是关于listview的各种问题也是很多.当我们使用自定义布局的Listview的时候,如果在item的布局文件里面存在Button或者是CheckBox等控件以及其子类控件的时候,经常会碰到各种控件的点击事件冲突的情况,那么我们如何来处理Listview中这种控件之间焦点冲突的情况呢? 这里有三种解决方案 1.将ListView中的Item布局中的子控件focusable属性设置为false2.在getView方法中设置but

listView中的button控件获取item的索引

在listview中的listitem设置事件响应,如果listitem中有button控件,这时候listitem就不会捕获到点击事件,而默认的是listitem中的button会捕获点击事件.那么如果点击listitem中的button怎么才能这个button是在哪一个item中呢,换句话说,就是点击listitem中的button怎么获取该listitem的索引?得到了这个索引的话,item里边的值就相对容易了. 通过如下方法可以实现: 1.在listitem中初始化button的时候,给

Android——使用ListView实现多级树形控件

思路:反复适配listview上的数据: 2.实现方法: (1)创建数据bean(包含一些属性信息): (2)转化为树节点TreeNode(id,parentId,bean); (3)用所有的树节点构建一棵树包括(根节点和其他节点): (4)Adapter的实现: 1)创建两个节点列表,一个保存list要显示的节点(showList),一个保存所有的节点(cache): 2)初始化是显示根节点: 3)每次的展开与收缩都是将被点击的节点的展开状态设为相反状态: 4)每次展开都是将所有的根节点和父节

【读书笔记-《Android游戏编程之从零开始》】6.Android 游戏开发常用的系统控件(TabHost、ListView)

3.9 TabSpec与TabHost TabHost类官方文档地址:http://developer.android.com/reference/android/widget/TabHost.html Android 实现tab视图有2种方法,一种是在布局页面中定义<tabhost>标签,另一种就是继承tabactivity.但是我比较喜欢第二种方式,应为如果页面比较复杂的话你的XML文件会写得比较庞大,用第二种方式XML页面相对要简洁得多. <?xml version="1

Android: ListView的使用(列表控件)

当程序中有大量的数据需要展示时,就需要用到 ListView 啦.ListView 允许用户通过手指上下滑动的方式将屏幕外的数据滚动到屏幕内,同时屏幕上原有的数据则会滚动出屏幕. 1.基本性质 (1)由于数组中的数据无法直接传递给ListView,我们需要借助适配器(Adapter)来完成.(2)Adapter有多种,需要根据ListView不同的使用情况选择不同的适配器.主要有两种ArrayAdapter / SimpleAdapter ListView的关键操作是制作一个符合要求的Adapt

Android中的基本控件(下,章节摘要)

1,如果用户在一个屏幕上添加了多个组件,则可以使用ScrollView进行包装实现滚动的效果,但是ScrollView组件只能对一个组件进行包装. 2,ListView可以实现数据的列表显示,可以通过SimpleAdapter类实现数据的封装. 3,对话框可以进行信息的提示,用户可以使用系统定义的对话框显示,也可以通过布局管理器定义自己的对话框显示布局. 4,AutoCompleteTextView组件可以实现随笔提示功能. 5,SeekBar可以进行拖动条的实现,用户可以使用OnSeekBar