Android中ListView的条目中有button时,item和button抢焦点问题

来源:互联网 发布:以前java上的石器时代 编辑:程序博客网 时间:2024/05/15 21:47

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



0 0