您的位置:首页 > 其它

ListView不能响应itemclick事件的解决方法

2012-12-20 11:11 363 查看
大家都知道listview可以根据自己的需求,重写baseadapter ,实现自己的布局及数据,但是当我们在自己的布局中加入了button或者ImageButton,还有其他比如checkbox,radiobutton等控件时,发现listview不在响应onitemclick事件,让人很悲愤啊,自己在网找了个方法,可以处理掉这个东东

发生的原因:当listview中包含button,checkbox等控件的时候,android会默认将focus给了这些控件,也就是说listview的item根本就获取不到focus,所以导致onitemclick时间不能触发。



既然我们知道了,发生的原因,那么我们就将button等控件的在xml布局文件中的属性android:focusable设置为false,就ok了,但通常不这样做,因为要一个一个地修改button太麻烦,通常可以修改这些button的父容器的descendantFocusability属性为false,是否很方便呢,这样即可以触发onitemclick事件,同时我们在baseadapter实现类中也可以处理button等控件的事件,两不相误。

给一下源码把,因为jar中很多测试例子所以就不给全部了,

1.list.xml

<?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="match_parent"

android:orientation="vertical" >

<ListView android:id="@+id/list"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

>

</ListView>

</LinearLayout>

复制代码
2.list_item.xml

<?xml version="1.0" encoding="utf-8"?>

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:descendantFocusability="blocksDescendants"

android:orientation="horizontal" >

<TextView android:layout_width="wrap_content" android:layout_height="wrap_content"

android:text="你好吗?"

android:id="@+id/text"

/>

<Button android:id="@+id/button"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_alignParentRight="true"

android:focusable="false"

android:text="确定"

/>

</RelativeLayout>

复制代码
3.Activity的oncreate方法

public void onCreate(Bundle savedInstanceState)

{

super.onCreate(savedInstanceState);

setContentView(R.layout.list);

listView = (ListView) findViewById(R.id.list);

final String[] title = {"衣服", "手机", "相机", "电视", "下载"};

BaseAdapter adapter = new BaseAdapter()

{

@Override

public View getView(int position, View convertView, ViewGroup parent)

{

ViewHodler hodler;

if (convertView == null)

{

LayoutInflater inflater = LayoutInflater.from(A.this);

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

hodler = new ViewHodler();

hodler.text = (TextView) convertView.findViewById(R.id.text);

hodler.b = (Button) convertView.findViewById(R.id.button);

convertView.setTag(hodler);

}

else

{

hodler = (ViewHodler) convertView.getTag();

}

hodler.text.setText(title[position]);

hodler.b.setText("立即订购" + title[position]);

hodler.b.setOnClickListener(new OnClickListener()

{

@Override

public void onClick(View v)

{

Toast.makeText(A.this, "你好吗?", 1).show();

}

});

return convertView;

}

@Override

public long getItemId(int position)

{

// TODO Auto-generated method stub

return position;

}

@Override

public Object getItem(int position)

{

// TODO Auto-generated method stub

return position;

}

@Override

public int getCount()

{

// TODO Auto-generated method stub

return title.length;

}

class ViewHodler

{

TextView text;

Button b;

}

};

listView.setAdapter(adapter);

listView.setOnItemClickListener(new OnItemClickListener()

{

@Override

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

{

Toast.makeText(A.this, "这是listview的itemclick", 1).show();

}

});

listView.setOnItemSelectedListener(new OnItemSelectedListener()

{

@Override

public void onItemSelected(AdapterView<?> parent, View view, int position, long id)

{

Toast.makeText(A.this, "这是listview的onItemSelected", 1).show();

}

@Override

public void onNothingSelected(AdapterView<?> parent)

{

// TODO Auto-generated method stub

}

});

}

如果发现错误,自己找一下,对自己有好处,不喜欢研究错误的程序猿不是好程序猿!!!!!!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: