Android基础整合项目(一) 之节日群发助手part 2
——转载请注明出处:coder-pig
本节引言:
在上一节中我们已经做出了我们群发助手的第一个界面以及完成了联系人的读取以及数据库的
录入了,在这一节中将要完成的工作是:
1)自定义我们的ListView的列表项,两个TextView + CheckBox;
2)使用SimpleCursorAdapter将数据显示到ListView上;
3)实现listview的全选与全不选
4)点击重置按钮后,将数据库中的state都重置为-1
好了,那么开始本节的内容吧!
布局代码如下:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/RelativeLayout1" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context="com.jay.example.festivalsmshelper.MainActivity" > <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="选择要发送的人" /> <ListView android:id="@+id/listcontacts" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_alignParentLeft="true" android:layout_below="@+id/TextView1" android:layout_above="@+id/buttomlayout" android:layout_marginTop="10dp" > </ListView> <LinearLayout android:id="@+id/buttomlayout" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:layout_alignParentLeft="true" android:orientation="horizontal" > <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/btnall" android:text="全选" /> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/btnreset" android:text="重置" /> <Button android:id="@+id/btnnext" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="下一步" /> <TextView android:layout_marginLeft="20dp" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="已选" android:textSize="15sp" /> <TextView android:layout_marginLeft="20dp" android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/textshow" android:textSize="15sp" /> </LinearLayout> </RelativeLayout>
其实就是三等分了布局,另外还隐藏了两个textview
代码如下:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="horizontal" android:gravity="center_horizontal" > <TextView android:gravity="center" android:id="@+id/listid" android:layout_width="0dp" android:layout_weight="1" android:layout_height="match_parent" android:visibility="gone" /> <TextView android:gravity="center" android:id="@+id/listname" android:layout_width="0dp" android:layout_weight="1" android:layout_height="match_parent" /> <TextView android:gravity="center" android:id="@+id/listphone" android:layout_width="0dp" android:layout_weight="1" android:layout_height="match_parent" /> <TextView android:id="@+id/listhide" android:layout_width="wrap_content" android:layout_height="match_parent" android:visibility="gone" /> <CheckBox android:focusable="false" android:clickable="false" android:id="@+id/listchoice" android:layout_width="0dp" android:layout_weight="1" android:layout_height="match_parent" /> </LinearLayout>
代码如下:
private void getContacts() { GetContactsService gs = new GetContactsService(ChooseActivity.this); Cursor cursor = gs.query("select _id,pname,pnumber,pstate from contacts", null); //注意:使用SimpleCursorAdapter的话,这个_id是必不可少的!不然一直报错 //所以在前面需要弄一个隐藏的组件来放_id simpleCursorAdapter = new SimpleCursorAdapter(ChooseActivity.this, R.layout.listitem, cursor, new String[]{"_id","pname","pnumber","pstate"}, new int[]{R.id.listid,R.id.listname,R.id.listphone,R.id.listhide}); list.setAdapter(simpleCursorAdapter); }
注意!!!!使用SimpleCursorAdapter的话,绑定的数据库表中一定要有_id这个字段,或者as _id;
而且在绑定时取出的数据必须包含这个_id项,否则的话会报以下错误!
java.lang.IllegalArgumentException: column ‘_id‘ does not exist
在Activity中调用3的getContacts( ),就可以看到我们的已经把数据库的数据显示到ListView上了:
①为listView设置setOnItemClickListener方法,即点击事件
②点击后要左什么呢?改变checkbox的选中状态,以及统计有多少个选中,然后显示出来
先定义一个用于统计当前选中的复选框数量:
private int setShow() { int num = 0; for(int i = 0;i < list.getChildCount();i++) { LinearLayout layout = (LinearLayout) list.getChildAt(i); CheckBox cbx = (CheckBox) layout.findViewById(R.id.listchoice); if(cbx.isChecked())num++; } return num; }
接着实现点击后复选框选中,以及已选数目的改变:
list.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { CheckBox cb = (CheckBox) view.findViewById(R.id.listchoice); TextView itemhide = (TextView) view.findViewById(R.id.listhide); TextView itemid = (TextView) view.findViewById(R.id.listid); int state = Integer.parseInt(itemhide.getText().toString()); //利用这个变量来区分按钮是否选中 state *= -1; itemhide.setText(state+""); if(state == 1)cb.setChecked(true); else cb.setChecked(false); textshow.setText(setShow()+"项"); } });
完成上述代码后运行出现以下效果:
就是选中全部的列表项,接着显示数目而已!
btnall.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { allflag *= -1; if(allflag == -1) { for(int i = 0;i < list.getChildCount();i++) { LinearLayout layout = (LinearLayout) list.getChildAt(i); CheckBox cbx = (CheckBox) layout.findViewById(R.id.listchoice); cbx.setChecked(true); btnall.setText("全不选"); textshow.setText(setShow()+"项"); } } else if(allflag == 1) { for(int i = 0;i < list.getChildCount();i++) { LinearLayout layout = (LinearLayout) list.getChildAt(i); CheckBox cbx = (CheckBox) layout.findViewById(R.id.listchoice); cbx.setChecked(false); btnall.setText("全选"); textshow.setText(setShow()+"项"); } } } });
在这个按钮事件要完成的工作:
①遍历listview,获取checkbox为选中状态的,将对应联系人id存储到集合中!
②将集合存放到Intent中,it.putIntegerArrayListExtra("ids", checkedId);
代码如下:
btnnext.setOnClickListener(new OnClickListener() { public void onClick(View v) { ArrayList<Integer> checkedId = new ArrayList<Integer>(); for(int i = 0;i < list.getChildCount();i++) { LinearLayout layout = (LinearLayout) list.getChildAt(i); CheckBox cbx = (CheckBox) layout.findViewById(R.id.listchoice); TextView txtid = (TextView) layout.findViewById(R.id.listid); if(cbx.isChecked()) checkedId.add(Integer.parseInt(txtid.getText().toString())); } //跳转到第三个页面,同时把数据存储到intent对象中 Intent it = new Intent(ChooseActivity.this,ThridActivity.class); it.putIntegerArrayListExtra("ids", checkedId); startActivity(it); } });恩呢,第二个界面就做好了!本节也到此结束了!
好了,最后总结下这节中用到的知识点:
1)在LinearLayout中使用weight属性将水平或者竖直方向平分成多份!
2)使用visibility对组件进行隐藏:visible(可见),invisible(不可见,但还占据空间),gone(不可见,也不占空间)
3)SimpleCursorAdapter绑定数据库与ListView需要注意必须要有:_id这个字段或者某字段 as _id;
4)如何统计listview复选框为选中状态的列数,遍历listview!
5)使用intent的putIntegerArrayListExtra存储ArrayList<T>集合类型的数据,传递到另一Activity中!
原文地址:http://blog.csdn.net/coder_pig/article/details/39208007