Android常用适配器控件(2)

我们通过改写系统的提供的布局Android.R.layout.list,向其中添加一个Button。注意:这里ListView的ID的规范:必须使用@android:id/list,因为ListActivity需要在布局中找到一个R.layout.list的ListView。

其次还需要注意的是:在布局LinearLayout中指定的ListView的高度,我们希望Button永远显示在在屏幕上,无论ListView中有多少项,我们不希望滚动到页面底部才能看到按钮。所以这里ListView的layout_height设置为0,然后使用layout_weight表面此空间应该占据父容器中的所有可用空间,同时为Button预留了空间。

最后我们未Button按钮添加了一个响应函数doClick。所以在我们的MainActivity中需要实现doClick方法。

代码清单:

public class MainActivity extends ListActivity {
 
 private ListView lv = null;
 private Cursor cursor;
 private int idCol = -1;
 private int nameCol = -1;
 private int noteCol = -1;
 
 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.list);
 
  lv = getListView();
  cursor = managedQuery(People.CONTENT_URI, null, null, null, People.NAME);
  String cols[] = new String[] {People.NAME};
  int [] views = new int[] {android.R.id.text1};
 
  idCol = cursor.getColumnIndex(People._ID);
  nameCol = cursor.getColumnIndex(People.NAME);
  noteCol = cursor.getColumnIndex(People.NOTES);
 
  SimpleCursorAdapter adapter = new SimpleCursorAdapter(this, android.R.layout.simple_list_item_multiple_choice,
    cursor, cols, views);
 
  this.setListAdapter(adapter); 
 
  lv.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
 }
 
 public void doClick(View view) {
  int count = lv.getCount();
  SparseBooleanArray viewItems = lv.getCheckedItemPositions();
  for(int i = 0; i < count; i++) {
   if(viewItems.get(i)) {
    cursor.moveToPosition(i);
    long id = cursor.getLong(idCol);
    String name = cursor.getString(nameCol);
    String notes = cursor.getString(noteCol);
    Toast.makeText(this, "info: notes="+notes, Toast.LENGTH_LONG).show();
   }
  }
 }
}

代码中:我们首先调用setContentView()方法设置活动的用户界面,在适配器的设置中我们为ListView的每一行传递了Android所提供了另一个视图android.R.layout.simple_list_item_multiple_choice,这将导致导致每一行拥有一个TextView与一个CheckBox。通过查看这个布局文件,将会看到其实是CheckedTextView,继承于TextView,这个特殊的TextView专门用于ListView的。它的TextView的ID为android.R.id.text1。

为了让用户能够选择多行,我们设置了ListView.CHOICE_MODE_MULTIPLE属性。

最后为了实现用于提交功能我们添加了一个Button,并为其添加了响应方法doClick。在doClick()方法中我们调用ListView.getCheckedItemPositions()返回一个boolean类型数组,表面是否选择了某一项。然后我们迭代ListView所有项,如果选择了相应行,viewItems.get(i)将返回true。当从ListView获得已经选择的位置编号之后我们就可以使用Cursor的moveToPosition()移动到相应位置读取数据了。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/ac3ea58bc59343cdedc51783b34ca330.html