`
daibalusu
  • 浏览: 343114 次
文章分类
社区版块
存档分类
最新评论

Android中自定义ListView无法响应OnItemClickListener中的onItemClick方法问题解决方案

 
阅读更多

转自http://www.7dot9.com/2010/09/android%E4%B8%AD%E8%87%AA%E5%AE%9A%E4%B9%89listview%E6%97%A0%E6%B3%95%E5%93%8D%E5%BA%94onitemclicklistener%E4%B8%AD%E7%9A%84onitemclick%E6%96%B9%E6%B3%95%E9%97%AE%E9%A2%98%E8%A7%A3%E5%86%B3%E6%96%B9/

在Android软件设计与实现中我们通常都会使用到ListView这个控件,系统有一些预置的Adapter可以使用,例如SimpleAdapter和ArrayAdapter,但是总是会有一些情况我们需要通过自定义ListView来实现一些效果,那么在这个时候,我们通常会碰到自定义ListView无法选中整个ListViewItem的情况,也就是无法响应ListView的onItemClickListener中的onItemClick()方法,究竟是为什么呢?我之前也在网上查过不少的资料,但是没有发现什么有价值的文章,有一些是建议在Adapter的getView方法中对自己需要响应单击事件的控件进行设置。但是最终的效果并不是特别理想,而且我认为这是一种取巧的方式,并不推荐。之后自己查看了一下ViewGroup的源码,发现了以下的一段常量声明:

/**
* This view will get focus before any of its descendants.
*/
public static final int FOCUS_BEFORE_DESCENDANTS = 0×20000;
/**
* This view will get focus only if none of its descendants want it.
*/
public static final int FOCUS_AFTER_DESCENDANTS = 0×40000;
/**
* This view will block any of its descendants from getting focus, even
* if they are focusable.
*/
public static final int FOCUS_BLOCK_DESCENDANTS = 0×60000;
/**     * This view will get focus before any of its descendants.     */

public static final int FOCUS_BEFORE_DESCENDANTS = 0×20000;
/**     * This view will get focus only if none of its descendants want it.     */

public static final int FOCUS_AFTER_DESCENDANTS = 0×40000;
/**     * This view will block any of its descendants from getting focus, even     * if they are focusable.     */

public static final int FOCUS_BLOCK_DESCENDANTS = 0×60000;

我们看到了一行代码定义的变量的意思是“当前View将屏蔽他所有子控件的Focus状态,即便这些子控件是可以Focus的”,其实这段话的意思就是这个变量代表着当前的View将不顾其子控件是否可以Focus自身接管了所有的Focus,通常默认能获得focus的控件有Button,Checkable继承来的所有控件,这就意味着如果你的自定义ListViewItem中有Button或者Checkable的子类控件的话,那么默认focus是交给了子控件,而ListView的Item能被选中的基础是它能获取Focus,也就是说我们可以通过将ListView中Item中包含的所有控件的focusable属性设置为false,这样的话ListView的Item自动获得了Focus的权限,也就可以被选中了,也就会响应onItemClickListener中的onItemClick()方法,然而将ListView的Item Layout的子控件focusable属性设置为false有点繁琐,我们可以通过对Item Layout的根控件设置其android:descendantFocusability=”blocksDescendant”即可,这样Item Layout就屏蔽了所有子控件获取Focus的权限,不需要针对Item Layout中的每一个控件重新设置focusable属性了,如此就可以顺利的响应onItemClickListener中的onItenClick()方法了。


分享到:
评论

相关推荐

    Android ListView 之 自定义Adapter 实现列表条目功能,以及 OnItemClickListener(点击事件) OnScrollListener(滑动事件)事件监听

    Android ListView 之 自定义Adapter 实现列表条目功能,以及 OnItemClickListener(点击事件) OnScrollListener(滑动事件)事件监听   目录 Android ListView 之 自定义Adapter 实现列表条目功能,以及 ...

    Android ListView获得选项中的值

    在Android中我们要如何获取ListView选中项的值呢? 我们举个例子,假如我们已经获得了手机中保存的联系人姓名和电话号码,并把它们显示在了一个Android ListView中,现在要实现的功能是当点击选中项时直接拨号,那么...

    Android 中ListView的Item点击事件失效的快速解决方法

    在平常的开发过程中,我们的ListView可能不只是简单的显示下文本或者按钮,更多的是显示复杂的布局,这样的话,我们就得自己写布局和自定义adapter了,一般是继承于BaseAdapter,示例代码见下方。写ListView的点击...

    Android 中ListView setOnItemClickListener点击无效原因分析

    主要介绍了Android 中ListView setOnItemClickListener点击无效原因分析的相关资料,需要的朋友可以参考下

    Android ListView position详解及实例代码

    我们在使用ListView的时候,一般都会为ListView添加一个响应事件android.widget.AdapterView.OnItemClickListener。对OnItemClickListener的position和id参数,我相信有些人在这上面走了些弯路。  在使用listview的...

    Android 实现ListView的点击变色的实例

    Android 实现ListView的点击变色的实例 我做了一个音乐播放器,其中用... private class ListViewClickListener implements OnItemClickListener{ @Override public void onItemClick(AdapterView<?> arg0, V

    android的ListView点击item使item展开的做法的实现代码

    本文介绍了android的ListView点击item使item展开的做法的实现代码,分享给大家,具体如下: 效果图: 原理是点击item的时候,重新measure list的各个item的高度 list.setOnItemClickListener(new ...

    谷歌天气并json解析xml

    import android.widget.AdapterView.OnItemClickListener; public class CityListActivity extends Activity implements OnItemClickListener{ private final static String TAG = "CityListActivity"; ...

    list嵌套list

    import android.widget.AdapterView.OnItemClickListener; import android.widget.ListView; import android.widget.Toast; /** * @author zl * @time 2014年12月24日15:37:18 */ public class ...

    Android资料

    public class MainActivity extends ListActivity implements OnItemClickListener { // private ListView lv; private String[] numbers = {"1", "2", "3", "4", "5", "6" ,"7"};//①先定义一个数组 private ...

    目录选择器源代码

    import android.widget.AdapterView.OnItemClickListener; import android.widget.ArrayAdapter; import android.widget.Button; import android.widget.EditText; import android.widget.LinearLayout; import ...

    访微信语音聊天

    import android.widget.AdapterView.OnItemClickListener; import android.widget.ArrayAdapter; import android.widget.FrameLayout; import android.widget.ListView; import android.widget.TextView; import ...

    Android天气预报实验报告

    Android天气预报实验报告模板 public class SetCityActivity extends Activity { //定义的一个自动定位的列表 private ListView gpsView; //定义的一个省份可伸缩性的列表 private ExpandableListView ...

    开发多媒体播放器

    /* 使用自定义的FileListAdapter来将数据传入ListView */ fileListView.setAdapter(new FileListAdapter(this, items)); } /** * 打开媒体文件 * @param f */ private void openFile(String path) { ...

    ListView-添加item的事件监听实例

    onItemClick(AdapterView<?> parent, View view, int position, long id) parent:官方解释为:The AdapterView where the click happened,也就是用户所点击的AdapterView,这个参数一般不用。 view:当前...

    自定义键盘PopupWindows弹出

    资源共享是每个android开发的责任,使用方法 private NumberKeyBoard dpk; private View passwdview; dpk = new NumberKeyBoard(this); passwdview = dpk.setup(); mListView.setOnItemClickListener(new ...

    package com.example.f1_telephone;

    import android.widget.AdapterView.OnItemClickListener; import android.widget.ListView; import android.content.ContentResolver; import android.content.DialogInterface; import android.content....

    FragmentView

    将fragment和listview结合使用 @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View v = inflater.inflate(R.layout.fragment1, null); ...

    军棋安卓版源码

    lineupListview = (ListView) findViewById(R.id.lineup_listview); lineupListview.setVisibility(View.INVISIBLE); // getLineupListviewData(); lineupListview.setOnItemClickListener(new AdapterView....

    蓝牙APP通信

    import android.widget.AdapterView.OnItemClickListener; import android.widget.BaseAdapter; import android.widget.ListView; import android.widget.TextView; public class MainActivity extends Activity { ...

Global site tag (gtag.js) - Google Analytics