1. 程式人生 > >Android中ListView的條目中有button時,item和button搶焦點問題

Android中ListView的條目中有button時,item和button搶焦點問題

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"
         />

如果沒有看明白,下載我的例子