Android记录3--ExpandableListView使用+获取SIM卡状态信息
2013年8月9日Android记录
ExpandableListView是一个可以实现下拉列表的控件,大家可能都用过QQ,QQ中的好友列表就是用ExpandableListView实现的,不过它是自定义的适配器。本篇博客除了要介绍ExpandableListView的使用,还整合了获取SIM的状态,这个很简单也就是获取系统服务,再调用相应的方法就可以实现,在这里只是记录一下。
本票博客要实现效果图如下:
除了子列表不怎么好看之外,组列表还是蛮好看的,这里只是为了演示,子列表就没做特别的处理。
布局文件:
/SIM_Card_Demo/res/layout/inbox.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@drawable/bg" android:orientation="vertical" > <RelativeLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@drawable/banner_bg" > <ImageButton android:id="@+id/imgBtn_Sort" android:layout_width="@dimen/banner_btn_width" android:layout_height="wrap_content" android:background="@drawable/banner_btn_bg_selector" android:src="@drawable/sort" /> <ImageView android:id="@+id/img_DividerSort" android:layout_width="wrap_content" android:layout_height="42dp" android:layout_toRightOf="@+id/imgBtn_Sort" android:src="@drawable/banner_divider" /> <ImageView android:id="@+id/img_DividerSearch" android:layout_width="wrap_content" android:layout_height="42dp" android:layout_toLeftOf="@+id/imgBtn_Search" android:src="@drawable/banner_divider" /> <LinearLayout android:id="@+id/linear_Title" android:layout_width="wrap_content" android:layout_height="42dp" android:layout_centerHorizontal="true" android:gravity="center_vertical" > <TextView android:id="@+id/text_Title" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/inbox" android:textColor="@color/white" android:textSize="22sp" android:textStyle="bold" /> <TextView android:id="@+id/text_MailCount" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="(0/0)" android:textColor="@color/white" android:textSize="14sp" android:textStyle="bold" /> </LinearLayout> <RelativeLayout android:layout_width="40dp" android:layout_height="42dp" android:layout_alignParentRight="true" android:layout_marginRight="54dp" > <ImageView android:id="@+id/img_Synchronizing" android:layout_width="18dp" android:layout_height="18dp" android:layout_centerInParent="true" android:contentDescription="@string/empty" android:scaleType="fitXY" android:src="@drawable/synchronizing" /> </RelativeLayout> <ImageButton android:id="@+id/imgBtn_Search" android:layout_width="@dimen/banner_btn_width" android:layout_height="wrap_content" android:layout_alignParentRight="true" android:background="@drawable/banner_btn_bg_selector" android:contentDescription="@string/search" android:src="@drawable/search" /> </RelativeLayout> <RelativeLayout android:layout_width="match_parent" android:layout_height="match_parent" > <ExpandableListView android:id="@+id/list_Inbox" android:layout_width="match_parent" android:layout_height="match_parent" android:cacheColorHint="@color/transparent" android:childDivider="@color/transparent" android:divider="@drawable/list_divider" android:fastScrollEnabled="true" android:groupIndicator="@color/transparent" android:listSelector="@color/transparent" android:scrollbars="none" /> </RelativeLayout> </LinearLayout>
组列表项
/SIM_Card_Demo/res/layout/group_item.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@drawable/bg" android:orientation="vertical" > <RelativeLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@drawable/banner_bg" > <ImageButton android:id="@+id/imgBtn_Sort" android:layout_width="@dimen/banner_btn_width" android:layout_height="wrap_content" android:background="@drawable/banner_btn_bg_selector" android:src="@drawable/sort" /> <ImageView android:id="@+id/img_DividerSort" android:layout_width="wrap_content" android:layout_height="42dp" android:layout_toRightOf="@+id/imgBtn_Sort" android:src="@drawable/banner_divider" /> <ImageView android:id="@+id/img_DividerSearch" android:layout_width="wrap_content" android:layout_height="42dp" android:layout_toLeftOf="@+id/imgBtn_Search" android:src="@drawable/banner_divider" /> <LinearLayout android:id="@+id/linear_Title" android:layout_width="wrap_content" android:layout_height="42dp" android:layout_centerHorizontal="true" android:gravity="center_vertical" > <TextView android:id="@+id/text_Title" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/inbox" android:textColor="@color/white" android:textSize="22sp" android:textStyle="bold" /> <TextView android:id="@+id/text_MailCount" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="(0/0)" android:textColor="@color/white" android:textSize="14sp" android:textStyle="bold" /> </LinearLayout> <RelativeLayout android:layout_width="40dp" android:layout_height="42dp" android:layout_alignParentRight="true" android:layout_marginRight="54dp" > <ImageView android:id="@+id/img_Synchronizing" android:layout_width="18dp" android:layout_height="18dp" android:layout_centerInParent="true" android:contentDescription="@string/empty" android:scaleType="fitXY" android:src="@drawable/synchronizing" /> </RelativeLayout> <ImageButton android:id="@+id/imgBtn_Search" android:layout_width="@dimen/banner_btn_width" android:layout_height="wrap_content" android:layout_alignParentRight="true" android:background="@drawable/banner_btn_bg_selector" android:contentDescription="@string/search" android:src="@drawable/search" /> </RelativeLayout> <RelativeLayout android:layout_width="match_parent" android:layout_height="match_parent" > <ExpandableListView android:id="@+id/list_Inbox" android:layout_width="match_parent" android:layout_height="match_parent" android:cacheColorHint="@color/transparent" android:childDivider="@color/transparent" android:divider="@drawable/list_divider" android:fastScrollEnabled="true" android:groupIndicator="@color/transparent" android:listSelector="@color/transparent" android:scrollbars="none" /> </RelativeLayout> </LinearLayout>
子列表项
/SIM_Card_Demo/res/layout/child_item.xml
<?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="vertical" android:background="@drawable/item_bg" > <TextView android:id="@+id/textView1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textColor="#ffff0000" android:text="SIM卡状态:" /> <TextView android:id="@+id/tv_sim_status" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textColor="#ff00ff00" android:text="@string/app_name" /> </LinearLayout>
自定义适配器(重要)
/SIM_Card_Demo/src/com/wwj/sim/demo/InboxListAdapter.java
package com.wwj.sim.demo; import java.util.List; import java.util.Map; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.BaseExpandableListAdapter; import android.widget.ExpandableListView; import android.widget.ImageButton; import android.widget.ImageView; import android.widget.TextView; /** * 自定义下列列表适配器 * @author wwj * 注:要继承BaseExpandableListAdpater * */ public class InboxListAdapter extends BaseExpandableListAdapter { private Inbox inbox; private ExpandableListView list_Inbox; private List<Map<String, Object>> groupList; private List<Map<String, String>> childList; private LayoutInflater inflater; /** * 构造函数 * * @param inbox * Activity对象引用 * @param list_Inbox * 下拉列表对象引用 * @param data * 数据 */ public InboxListAdapter(Inbox inbox, ExpandableListView list_Inbox, List<Map<String, Object>> groupList, List<Map<String, String>> childList) { super(); this.inbox = inbox; this.list_Inbox = list_Inbox; this.groupList = groupList; this.childList = childList; inflater = LayoutInflater.from(inbox); } /** * * @author wwj * */ private class GroupViewHolder { ImageButton imgBtn_Photo; TextView tv_name; TextView tv_number; TextView tv_details; ImageView img_status; public GroupViewHolder(View convertView) { imgBtn_Photo = (ImageButton) convertView .findViewById(R.id.imgBtn_Photo); img_status = (ImageView) convertView.findViewById(R.id.img_Status); tv_details = (TextView) convertView.findViewById(R.id.text_Details); tv_name = (TextView) convertView.findViewById(R.id.text_Name); tv_number = (TextView) convertView.findViewById(R.id.text_Number); // 这个是防止图片聚焦,造成列表不能点击 imgBtn_Photo.setFocusable(false); } } private class ChildViewHolder { TextView tv_sim_status; public ChildViewHolder(View converView) { tv_sim_status = (TextView) converView .findViewById(R.id.tv_sim_status); } } @Override public Object getChild(int groupPosition, int childPosition) { return childPosition; } @Override public long getChildId(int groupPosition, int childPosition) { return childPosition; } @Override public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View converView, ViewGroup parent) { final ChildViewHolder childViewHolder; if (converView == null) { converView = inflater.inflate(R.layout.child_item, null); childViewHolder = new ChildViewHolder(converView); converView.setTag(childViewHolder); } else { childViewHolder = (ChildViewHolder) converView.getTag(); } childViewHolder.tv_sim_status.setText(childList.get(childPosition) .get("tv_sim_status")); return converView; } @Override public int getChildrenCount(int groupPosition) { return childList.size(); } @Override public Object getGroup(int groupPosition) { return groupList.get(groupPosition); } @Override public int getGroupCount() { return groupList.size(); } @Override public long getGroupId(int groupPosition) { return groupPosition; } @Override public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) { final GroupViewHolder groupViewHolder; if (convertView == null) { convertView = inflater.inflate(R.layout.group_item, null); groupViewHolder = new GroupViewHolder(convertView); convertView.setTag(groupViewHolder); } else { groupViewHolder = (GroupViewHolder) convertView.getTag(); } groupViewHolder.img_status.setImageResource(R.drawable.mail_status_new); groupViewHolder.tv_name.setText(groupList.get(groupPosition) .get("username").toString()); groupViewHolder.tv_number.setText(groupList.get(groupPosition) .get("number").toString()); groupViewHolder.tv_details.setText(groupList.get(groupPosition) .get("detail").toString()); groupViewHolder.imgBtn_Photo .setImageResource(R.drawable.contact_photo_default); return convertView; } @Override public boolean hasStableIds() { return false; } @Override public boolean isChildSelectable(int arg0, int arg1) { return false; } }
/SIM_Card_Demo/src/com/wwj/sim/demo/Inbox.java
package com.wwj.sim.demo; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import android.app.Activity; import android.content.Context; import android.os.Bundle; import android.telephony.TelephonyManager; import android.widget.ExpandableListView; public class Inbox extends Activity { public ExpandableListView list_Inbox; //下拉List控件 public InboxListAdapter adapter; private TelephonyManager telephonyManager; //用来获取电话的一些信息 List<Map<String, Object>> groupList; List<Map<String, String>> childList; String sim_status; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.inbox); sim_status = readSIMCard(); getData(); //找到这个控件 list_Inbox = (ExpandableListView) findViewById(R.id.list_Inbox); list_Inbox.setAdapter(new InboxListAdapter(Inbox.this, list_Inbox, groupList, childList)); list_Inbox.setOnGroupExpandListener(new OneListItemExpandListener(list_Inbox)); } void getData() { groupList = new ArrayList<Map<String,Object>>(); Map<String, Object> groupMap = new HashMap<String, Object>(); groupMap.put("username", "张三"); groupMap.put("number", "44440011"); groupMap.put("detail", "4秒 2013-08-06 13:08"); groupList.add(groupMap); groupMap = new HashMap<String, Object>(); groupMap.put("username", "李四"); groupMap.put("number", "44440012"); groupMap.put("detail", "6秒 2013-08-06 13:09"); groupList.add(groupMap); groupMap = new HashMap<String, Object>(); groupMap.put("username", "王五"); groupMap.put("number", "44440013"); groupMap.put("detail", "5秒 2013-08-06 13:10"); groupList.add(groupMap); childList = new ArrayList<Map<String,String>>(); Map<String, String> childMap1 = new HashMap<String, String>(); childMap1.put("tv_sim_status", sim_status); childList.add(childMap1); } public String readSIMCard() { TelephonyManager tm = (TelephonyManager) this .getSystemService(TELEPHONY_SERVICE);// 取得相关系统服务 StringBuffer sb = new StringBuffer(); switch (tm.getSimState()) { // getSimState()取得sim的状态 有下面6中状态 case TelephonyManager.SIM_STATE_ABSENT: sb.append("无卡"); break; case TelephonyManager.SIM_STATE_UNKNOWN: sb.append("未知状态"); break; case TelephonyManager.SIM_STATE_NETWORK_LOCKED: sb.append("需要NetworkPIN解锁"); break; case TelephonyManager.SIM_STATE_PIN_REQUIRED: sb.append("需要PIN解锁"); break; case TelephonyManager.SIM_STATE_PUK_REQUIRED: sb.append("需要PUK解锁"); break; case TelephonyManager.SIM_STATE_READY: sb.append("良好"); break; } if (tm.getSimSerialNumber() != null) { sb.append("@" + tm.getSimSerialNumber().toString()); } else { sb.append("@无法取得SIM卡号"); } if (tm.getSimOperator().equals("")) { sb.append("@无法取得供货商代码"); } else { sb.append("@" + tm.getSimOperator().toString()); } if (tm.getSimOperatorName().equals("")) { sb.append("@无法取得供货商"); } else { sb.append("@" + tm.getSimOperatorName().toString()); } if (tm.getSimCountryIso().equals("")) { sb.append("@无法取得国籍"); } else { sb.append("@" + tm.getSimCountryIso().toString()); } if (tm.getNetworkOperator().equals("")) { sb.append("@无法取得网络运营商"); } else { sb.append("@" + tm.getNetworkOperator()); } if (tm.getNetworkOperatorName().equals("")) { sb.append("@无法取得网络运营商名称"); } else { sb.append("@" + tm.getNetworkOperatorName()); } if (tm.getNetworkType() == 0) { sb.append("@无法取得网络类型"); } else { sb.append("@" + tm.getNetworkType()); } return sb.toString(); } }
点击列表展开的监听器
/SIM_Card_Demo/src/com/wwj/sim/demo/OneListItemExpandListener.java
package com.wwj.sim.demo; import android.widget.ExpandableListView; import android.widget.ExpandableListView.OnGroupExpandListener; /** * 自定义列表监听器 * @author wwj * 实现OnGroupExpandListener接口 */ public class OneListItemExpandListener implements OnGroupExpandListener { protected ExpandableListView listView; public OneListItemExpandListener(ExpandableListView listView) { this.listView = listView; } @Override public void onGroupExpand(int groupPosition) { for(int i = 0, count = listView.getExpandableListAdapter().getGroupCount(); i < count; i++) { if(groupPosition != i) { //关闭其他 if(listView.isGroupExpanded(groupPosition)) { listView.collapseGroup(i); } } else if(groupPosition == listView.getFirstVisiblePosition()){ // 让第一条可见 // android1.6不支持以下方法 listView.smoothScrollToPosition(groupPosition); } } } }