Android中ListView的条目中有button时,item的点击事件失效。
这个问题我总结了3点:
1、button的点击事件要写在自定义适配器中。
2、ListView条目点击事件要写在Activity中。
3、button的属性中必须要写 android:focusable="false"。
4、在Item布局的根布局加上android:descendantFocusability=”blocksDescendants”的属性就好了,至此listview点击的灵异事件告一段落。心得:遇到不会不懂的地方除了网上查询资料之外,也可以多多去尝试每种属性的作用,多阅读官方文档(我始终觉得还是读原文的比翻译的理解的会更好)。
写好以上三点,则listview的条目有点击事件,button中也有点击事件,一切正常。
下面是我写的一个例子
核心代码:
自定义适配器:
public class MyBaseAdapter extends BaseAdapter {
private Context context;
private List<Map<String, Object>> listData;
public MyBaseAdapter(Context context,List<Map<String, Object>> listData) {
this.context=context;
this.listData=listData;
}
@Override
public int getCount() {
return listData.size();
}
@Override
public Object getItem(int position) {
return listData.get(position);
}
@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
LayoutInflater layoutInflater= (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView=layoutInflater.inflate(R.layout.main_item, null);
Button button = (Button) convertView.findViewById(R.id.button1);
TextView tv=(TextView) convertView.findViewById(R.id.textView1);
String wenzi=(String) listData.get(position).get("wenzi");
tv.setText(wenzi);
/**
* 点击事件
*/
button.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Intent intent =new Intent();
intent.setClass(context, OtherActivity.class);
context.startActivity(intent);
}
});
return convertView;
}
}//class
activity中
public class MainActivity extends Activity {
private ListView listView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
listView=(ListView) findViewById(R.id.listView1);
//得到数据
List<Map<String, Object>> listData = myGetData();
//得到适配器对象
MyBaseAdapter adapter=new MyBaseAdapter(this, listData);
listView.setAdapter(adapter);
/**
* 点击事件
*/
listView.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
// Toast.makeText(MainActivity.this, "条目被点击了", 10).show();
Intent intent = new Intent();
intent.setClass(MainActivity.this, OtherActivity.class);
startActivity(intent);
}
});
}
/**
* 自己编一组数据
* @return
*/
private List<Map<String, Object>> myGetData() {
List<Map<String, Object>>list =new ArrayList<Map<String,Object>>();
for (int i = 0; i < 10; i++) {
Map<String, Object>map=new HashMap<String, Object>();
map.put("wenzi", "zhangfei"+i);
list.add(map);
}
return list;
}
}//class
listview的item中的Button
<Button
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="点击"
android:focusable="false"
/>
如果没有看明白,下载我的例子
http://download.csdn.net/detail/zhaihaohao1/8274795