前言
在平常的开发过程中,使用ListView的时候,我们不可能永远只让ListView用来只是简单的显示
下文本或者按钮,更多的是显示复杂的布局,有时候必然还需要做一些其他操作,比如我们通常会使
用到其item的点击事件,用来显示item的详细信息或者点击listview的item跳转到一个新的activity。
这时候默认的Adapter已经不足以满足我们的要求了,这时我们就得自己写布局和自定义adapter了,
一般我们是继承于BaseAdapter的。至于怎么自定义Adapter请点击下面的链接看我以前写的教程:
自定义ListView及Adapter教程:
创建完LIstView及Adapter后就可以写ListView的item的点击事件了。
listview提供了onItemClickListener()方法,在方法中我们可以执行我们需要的内容。
ListView点击事件写法:
//ListView item 的的点击事件
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
// Toast.makeText(MainActivity.this, "Click item:" + i, Toast.LENGTH_SHORT).show();
MyToast.shouToast(MainActivity.this, "Click item:" + i, Toast.LENGTH_SHORT);
});
item点击事件失效解决
下面关键点来了,我们有时候使用了ListView控件,代码编写完成后,经过模拟器运行,发现ListView的
setOnItemClickListener()方法失效。这时候肯定很多人怀疑是自己在增加功能时不小心删去或修改了使点击事
件正常的代码,但是经过检查,又发现代码正确无误。
其实
,导致整个Item点击失效的原因多半是由于在【你自己定义的Item中存在诸如ImageButton,
Button,CheckBox等子控件(也可以说是Button或者Checkable的子类控件)】,此时这些子控件会将焦点获取
到,所以常常当点击item时变化的是子控件,item本身的点击没有响应。这时候你就需要改变其焦点了。
方法一
给其中子控件如Button添加一个属性
android:focusable=”false”
目的是为了不让子控件强制获取
item的焦点,否则item的点击事件就没用了。如:
<Button
android:id="@+id/delete"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:focusable="false"
android:text="删除"/>
方法二
可以使用descendantFocusability来解决,其中descendantFocusability对应的属性有3个
该属性是当一个为view获取焦点时,定义viewGroup和其子控件两者之间的关系。
属性的值有三种:
beforeDescendants: viewgroup会优先其子类控件而获取到焦点
afterDescendants: viewgroup只有当其子类控件不需要获取焦点时才获取焦点
blocksDescendants: viewgroup会覆盖子类控件而直接获得焦点
通常我们用到的是第三种,即在Item布局的根布局加上android:descendantFocusability=”blocksDescendants”的属性就好了,如:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:descendantFocusability="blocksDescendants"
android:orientation="horizontal">
<TextView
android:id="@+id/name"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"/>
<Button
android:id="@+id/delete"
android:layout_width="55dp"
android:layout_height="40dp"
android:focusable="false"
android:text="删除"/>
</LinearLayout>