这个小例子包含:ListActivity中CheckBox的勾选事件处理,List中Item的单击和长按事件处理,以及在list下方显示一个不随List滚动的Button
当ListActivity中包含Button或CheckBox这些能得到焦点控件时,要让List相应OnListItemClick事件,只要让Button或CheckBox的属性focusable=“false"
my_list_item.xml:(注意layout文件中checkBox的属性focusable的设置)
<?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"> <TextView android:id="@+id/textView1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:layout_alignParentTop="true" android:text="text view" android:focusable="false" /> <CheckBox android:id="@+id/check" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentRight="true" android:layout_alignParentTop="true" android:focusable="false" android:focusableInTouchMode="false" /> </RelativeLayout>关于CheckBox的事件处理,网上看到的一些方法比较复杂,这里提供一种比较方便的方法:派生一个SimpleAdaper的子类,只要重写它的getView()方法,在方法体里为checkBox添加OnCheckChangedListener即可,并将CheckBox.tag字段这为这个checkBox所在的行数,方便知道是那一行的checkBox被勾选
public class MyListActivity extends ListActivity implements OnCheckedChangeListener, OnItemLongClickListener { private ArrayList<HashMap<String, Object>> listItems; private SimpleAdapter listItemAdapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); listItems = new ArrayList<HashMap<String,Object>>(); listItemAdapter = new MySimpleAdapter(this, listItems, R.layout.my_list_item, new String[]{"text","check"}, new int[]{R.id.textView1, R.id.check}); setListAdapter(listItemAdapter); for(int i=0;i<3;i++) { HashMap<String, Object>map = new HashMap<String, Object>(); map.put("text", "第"+i+"行"); map.put("check", true); listItems.add(map); } // 在activity的底部添加一个不属于list里面的button Button addButton=new Button(this); addButton.setText("button"); FrameLayout.LayoutParams lp = new FrameLayout.LayoutParams(FrameLayout.LayoutParams.FILL_PARENT, FrameLayout.LayoutParams.WRAP_CONTENT); lp.gravity=Gravity.BOTTOM; addContentView(addButton,lp); // 长按: getListView().setOnItemLongClickListener(this); // 刷新: setListAdapter(listItemAdapter); } // 写一个能监听checkBox勾选事件的SimpleAdapter,如果不是checkBox而是button.onClick事件也是类似的 private class MySimpleAdapter extends SimpleAdapter { @Override public View getView(int position, View convertView, ViewGroup parent) { View view = super.getView(position, convertView, parent); if(view!=null) { CheckBox cb = (CheckBox) view.findViewById(R.id.check); // 小技巧:checkBox 的 tag 为它所在的行,在onCheckedChanged方法里面用到 cb.setTag(position); cb.setOnCheckedChangeListener(MyListActivity.this); } return view; } public MySimpleAdapter(Context context, List<? extends Map<String, ?>> data, int resource, String[] from, int[] to) { super(context, data, resource, from, to); } } public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { int row = (Integer) buttonView.getTag(); Toast.makeText(this, "第"+row+"行的checkBox被点击", Toast.LENGTH_LONG).show(); } public boolean onItemLongClick(AdapterView<?> av, View v, int position, long id) { Toast.makeText(this, "第"+position+"行被长按", Toast.LENGTH_LONG).show(); return true; } @Override protected void onListItemClick(ListView l, View v, int position, long id) { Toast.makeText(this, "第"+position+"行被点击", Toast.LENGTH_LONG).show(); } }